Scala学习笔记--上界(<:)、视图界定(<%)、上下文界定(T:M)
上界 下界 视界
object Test{
def main(args:Array[String]):Unit={
def mulBy(factor:Double)=(x:Double)=>factor*x
val triple =mulBy(3);
println(triple(10))
println(mulBy(3)(5))
val p1 = new Pair("dd","ee");
println(p1.smaller)
//val p2 = new Pair(1,2); //不可以这么用
val p2 = new Pair2(1,2); //使用视图界定,可以
println(p2.smaller)
val p3 = new Pair3(1,2);
println(p3.smaller)
}
}
//-----------------上界----------------
class Pair[T<:Comparable[T]] (val first:T,val second :T){
def smaller = if(first.compareTo(second)<0) first else second
}
//---------------视图界定---------------
/*
* 如果试着new一个Pair(4,2),编译器会提示Int不是Comparable[Int]的子类型。
* 和java.long.Integer包装类型不同,Scala的Int类型没有实现Comparable。
* 不过,RichInt实现了Comparable[Int],同时还有一个从Int到RichInt的隐式转换
*/
//视图界定
class Pair2[T<% Comparable[T]](val first:T,val second:T){
def smaller = if(first.compareTo(second)<0) first else second
}
/*
* 用Ordered特质会更好,它在Comparable的基础上额外提供了关系操作符
* */
class Pair22[T<% Ordered[T]](val first:T,val second:T){
def smaller = if(first<second) first else second
}
/*上界没有这样做因为java.lang.String实现了Comparable[String],
* 但没有实现Ordered[String]。有了视图界定,这就不是问题。
* 字符串可以被隐式转换成RichString,而RichString是Ordered[String]的子类型
* */
//--------------------上下文界定----------------------
/*
* 视图界定T<%V 要求必须存在一个从T到V的隐式转换。
* 上下文界定的形式为T:M, 其中M是另一个泛型类,它要求必须存在一个类型为M[T]的“隐形值”
* 例如 class Pair[T: Ordering]
* 上述定义要求必须存在一个类型为Ordering[T]的隐式值。 该隐式值可以被用在该类的方法中
* 当你声明一个使用隐式值的方法时,需要添加一个"隐式参数" *
*/
class Pair3[T:Ordering](val first:T,val second : T){
def smaller(implicit ord: Ordering[T])=
if(ord.compare(first,second)<0) first else second
}
Scala学习笔记--上界(<:)、视图界定(<%)、上下文界定(T:M)的更多相关文章
- Django:学习笔记(9)——视图
Django:学习笔记(9)——视图 基础视图 基于函数的视图,我们需要在使用条件语句来判断请求类型,并分支处理.但是在基于类的视图中,我们可以在类中定义不同请求类型的方法来处理相对应的请求. 基于函 ...
- Django:学习笔记(8)——视图
Django:学习笔记(8)——视图
- 基于.net的分布式系统限流组件 C# DataGridView绑定List对象时,利用BindingList来实现增删查改 .net中ThreadPool与Task的认识总结 C# 排序技术研究与对比 基于.net的通用内存缓存模型组件 Scala学习笔记:重要语法特性
基于.net的分布式系统限流组件 在互联网应用中,流量洪峰是常有的事情.在应对流量洪峰时,通用的处理模式一般有排队.限流,这样可以非常直接有效的保护系统,防止系统被打爆.另外,通过限流技术手段,可 ...
- Scala学习笔记及与Java不同之处总结-从Java开发者角度
Scala与Java具有很多相似之处,但又有很多不同.这里主要从一个Java开发者的角度,总结在使用Scala的过程中所面临的一些思维转变. 这里仅仅是总结了部分两种语言在开发过程中的不同,以后会陆续 ...
- Scala学习笔记(详细)
第2章 变量 val,var,声明变量必须初始化:变量类型确定后不可更改 数据类型:与java有相同的数据类型,在scala中数据类型都是对象 特殊类型:Unit:表示无值,只有一个实例值写出(),相 ...
- Scala学习笔记之:tuple、array、Map
[TOC] 本文<快学Scala>的笔记 tuple学习笔记 tuple的定义 对偶是元组(tuple)的最简单形态--元组是不同类型的值的聚集. 元组的值是通过将单个值包含在圆括号中构成 ...
- 《C#并发编程经典实例》学习笔记—2.7 避免上下文延续
避免上下文延续 在默认情况下,一个 async 方法在被 await 调用后恢复运行时,会在原来的上下文中运行. 为了避免在上下文中恢复运行,可让 await 调用 ConfigureAwait 方法 ...
- 机器学习(三)--- scala学习笔记
Scala是一门多范式的编程语言,一种类似Java的编程语言,设计初衷是实现可伸缩的语言.并集成面向对象编程和函数式编程的各种特性. Spark是UC Berkeley AMP lab所开源的类Had ...
- scala学习笔记-类型参数中协变(+)、逆变(-)、类型上界(<:)和类型下界(>:)的使用
转载自 fineqtbull http://fineqtbull.iteye.com/blog/477994 有位je上的同学来短信向我问起了Scala类型参数中协变.逆变.类型上界和类型下界的 ...
随机推荐
- (摘)ORACLE DBA的职责
ORACLE数据库管理员应按如下方式对ORACLE数据库系统做定期监控: (1). 每天对ORACLE数据库的运行状态,日志文件,备份情况,数据 库的空间使用情况,系统资源的使用情况进行检查,发现并解 ...
- mysql创建utf-8字符集数据库
CREATE DATABASE db_name DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci; CREATE DATABASE 的语法:CREA ...
- RazorPad中的ModelProvider
在RazorPad的右侧 我们可以提供模型的结构,Json数据结构体 当提供多个的时候 是Json中的数组 [{ Name: "NI" }, { Name: &qu ...
- Linux tr 命令使用
man tr: TR(1) User Commands TR(1) NAME tr - translate or delete characters SYNOPSIS tr [OPTION]... S ...
- centos下httpd 启动失败的解决办法
[root@csit yang]# service httpd start Starting httpd: [FA ...
- NOI2012 美食节
http://www.lydsy.com/JudgeOnline/problem.php?id=2879 费用流. 我们发现,每个厨师做的倒数第k道菜对总等待时间的贡献为k*做这道菜的时间. 将每个厨 ...
- Android:TextView跑马灯-详解
Android:TextView跑马灯_详解 引言: TextView之所以需要跑马灯,是由于文字太长,或者是吸引眼球. 关键代码如下: android:singleLine="true&q ...
- 一个跨域请求的XSS续
之前讨论过,在解决post跨域请求时,采用iframe+本域代理页的形式,兼容性(当然是包括IE6啦)是最好的.上次提到,代理页面的作用是:执行本域下的回调函数.就是这个原因,给XSS带来了便利.详细 ...
- 关于void*函数返回
一. sample #include<iostream> using namespace std; void* test(void* pass) { return pass; } int ...
- jquery图片3D旋绕效果 rotate3Di的操作
这是一个图片效果,很简单实用,只需要一个"rotate3Di.js"的插件就行, 关于rotate的用法有如下几种: $(选择器).rotate3Di(30); //把图片3D旋转 ...