Scala List:为什么这个 List 操作有效?
Scala List: Why does this List operation work?
鉴于::的完整签名如下
::[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?
所有的工作和编译...但为什么最后一行甚至工作?上面的签名不是说它只有在附加了 orange 的超类型时才有效吗?
我知道 BigOrange 是一个 Orange,因此从直觉上看,橙子列表可以添加一个 BigOrange。但是签名:它似乎明确禁止该操作
<:
和 >:
是自反的,即每种类型都是其自身的子类型和超类型。
因此引入 B >: A
作为前缀项的类型并不会禁止 A
.
类型的值
鉴于::的完整签名如下
::[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?
所有的工作和编译...但为什么最后一行甚至工作?上面的签名不是说它只有在附加了 orange 的超类型时才有效吗?
我知道 BigOrange 是一个 Orange,因此从直觉上看,橙子列表可以添加一个 BigOrange。但是签名:它似乎明确禁止该操作
<:
和 >:
是自反的,即每种类型都是其自身的子类型和超类型。
因此引入 B >: A
作为前缀项的类型并不会禁止 A
.