您的位置:首页 > 其它

scala类型系统:11) upper bounds & lower bounds

2016-11-09 09:52 260 查看
scala类型系统:11) upper bounds & lower bounds

Upper Bounds

在Java泛型里表示某个类型是Test类型的子类型,使用extends关键字:
<T extends Test>

//或用通配符的形式:
<? extends Test>


这种形式也叫
upper bounds
(中文为上限或上界),同样的意思在scala的写法为:
[T <: Test]

//或用通配符:
[_ <: Test]


upper bounds
适用于把泛型对象当作数据的提供者(生产者)的场景下:
scala>  def pr(list : List[_ <: Any]) {
list.foreach(print)
}


Lower Bounds

在Java泛型里表示某个类型是Test类型的父类型,使用super关键字:
<T super Test>

//或用通配符的形式:
<? super Test>


这种形式也叫
lower bounds
(中文为下限或下界),同样的意思在scala的写法为:
[T >: Test]

//或用通配符:
[_ >: Test]


lower bound
适用于把泛型对象当作数据的消费者的场景下:
scala>  def append[T >: String] (buf : ListBuffer[T])  = {
buf.append( "hi")
}


基本上与java一致,不过在复杂一点的情况下,对多重界定,有一些差异:

Java里,T 同时是 A 和 B 的子类型,称为
multiple bounds

<T extends A & B>


Scala里对上界和下界不能有多个,不过变通的做法是使用复合类型(compund type):
[T <: A with B]


而对于
lower bounds
,在java里则不支持
multiple
bounds
的形式:
<T super A & B> //java不支持


Scala里对复合类型同样可以使用
lower bound

[T >: A with B]


因为Scala里对于 
A with B
相当于 
(A
with B)
,仍看成一个类型,参考复合类型



转载自:http://hongjiang.info/scala/   推荐大家阅读下这位大哥出版的书《Scala函数式编程》
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: