Scala中类型约束

Scala中类型约束

泛型

(1)定义泛型

//定义一个泛型类
class Clothes[A,B,C](val clothType: A, val color: B, val size: C){
	//定义泛型方法
	def say[A](content: A) = println(content)
}
val c1 = new Clothes[String,String,Int]("a","b",34)
c1.say[Double](45.25)

类型约束

(1)java中类型约束
在java泛型里表示某个类型是A类型的子类,使用extends关键字,这种形式叫upper bounds(上界)
或通配符形式<? extends A>
在Scala中上界 [ T <: A ]或通配符形式[ _ <: A ]
在java泛型里表示某个类型是A的父类型,使用关键字super,这种形式叫下界,或<? super A>
在Scala中[T >: A]或[ _ >: A]

视图定界与上下文界定

Scala支持两种特殊的类型约束操作符,它们其实不是真正的类型约束而是隐式查找,这两种操作符就是下文界定和视图界定。这些操作符允许定义一个隐式参数雷柏哦来作为泛型类型的类型约束。

视图界定

视图界定用来“要求”一个可用的隐式视图来将一种类型自动转换成另一种类型

//含义:foo方法定义了一个约束 A <% B,意思是参数x的类型为A,并且在调用的地方必须
//存在相应的隐式转换A => B
def foo[A <% B](x: A) = x
//这个foo方法也可以用一个不带类型约束的类型参数来定义。有两个参数:一个接受一个A类型的参数,
//第二个接受一个隐式转换函数。尽管第二种形式要打更多字,但是他给隐式转换函数打了个用户自定义的标签。
def foo[A](x: A)(implicit m: A => B) =x

上下文界定

上下文界定用来“要求”一个可用的隐式值存在,且必须存在

//foo方法定义了约束A:B,这个约束的含义是参数x的类型为A,
//并且调用foo方法时必须有一个可用的隐式值B[A]存在
def foo[A : B](x: A) = x
//这个foo方法定义了两个参数,其隐式参数接受一个B[A]类型的值。
//尽管第二种形式要打更多字,但是他给隐式值打了个用户自定义的标签。
def foo[A](x: A)(implicit arg: B[A]) = x

实例1

def bigger1[T <% Ordered[T]](first: T,second: T): T = {
	if (first.>(second)) first else second
}
val aa = bigger1(10,20)
println(aa)
def bigger2[T](first: T, second: T)(implicit f: T => Ordered[T]) = {
	if (first.>(second)) first else second
}
val bb = bigger2(10,20)
println(bb)

实例2

def bigger1[T : Ordering](first: T,second: T): T = {
	if (Ordering[T].compare(first,second) > 0) first else second
}
val aa = bigger1(10,20)
println(aa)
def bigger2[T](first: T, second: T)(implicit f: Ordering[T]) = {
	if (f.compare(first,second) > 0 ) first else second
}
val bb = bigger2(10,20)
println(bb)
posted @ 2019-03-03 15:16  刘丽刚  阅读(242)  评论(0)    收藏  举报