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



给定 :: 的完整签名如下::[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就是橙子,所以橙子列表能够添加BigOrange似乎是直观的。 但是签名:它明确似乎不允许该操作

<:>:是反身的,也就是说每个类型都是自身的子类型和超类型。

因此,引入B >: A作为前置项的类型并不允许A类型的值。

最新更新