Scala列表:为什么此List操作有效?

时间:2017-07-01 15:56:03

标签: scala list covariance

鉴于::的完整签名如下   ::[B >: A](x: B): List[B]

那么为什么这个例子有效呢?

class Fruit(name: String) { }
class Orange(name: String) extends Fruit(name)
class BigOrange(name:String) extends Orange(name)

 val f = new Fruit("fruit")
 val a = new Apple("apple")
 val o = new Orange("orange")
 val bo = new BigOrange("big orange")

 val oList :List[Orange] = List[Orange](o,o) 
 val fList1: List[Fruit] = f::oList
 val fList2: List[Fruit] = a::oList
 val  oList2 :List[Orange] = bo::oList // works, but why?

所有工作和编译......但为什么最后一行甚至可以工作?上面的签名是否只有在附加橙色的超类型时才有效?

我认为BigOrange是一个Orange,所以看起来直观的是橙色列表能够添加BigOrange。但签名:它显然似乎不允许该操作

1 个答案:

答案 0 :(得分:3)

<:>:是反身的,即每种类型都是自身的子类型和超类型。

因此,引入B >: A作为前置项的类型不会禁止A类型的值。