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)
,仍看成一个类型,参考复合类型
upper bounds适用于把泛型对象当作数据的提供者(生产者)的场景
lower bound适用于把泛型对象当作数据的消费者的场景下
请教:
这里的两种适用于的场景是什么原因能给我讲解一下吗,
upper bounds适用于把泛型对象当作数据的消费者的场景不?
谢谢
参考一下这两篇文章:
1) java泛型的理解: https://hongjiang.info/java-generics/
2) scala雾中风景(10): 逆变点与协变点: https://hongjiang.info/scala-pitfalls-10/