一个简单的问题。类的不可变的方法::
List
被定义为:::列表中的方法 - 逆变参数类型
密封抽象类列表[+ A] ...
DEF :: [B>:A](X:B):列表[B ]
假设说我有:
class Fruit
class Mango extends Fruit
scala> val d:List[Fruit] = List.empty[Fruit]
d: List[Fruit] = List()
scala> new Mango :: d
res5: List[Fruit] = List([email protected])
现在我很困惑在这里。根据::
声明,参数类型应该是逆变的。即在这种情况下,任何类>: Fruit
(我明白为什么它是这样做的)。但是我没有得到的是Mango <: Fruit
,那为什么编译器不会出错呢?
是的同意。这是'List'的属性。但是这里的方法限制了参数的类型。它应该是'_>:水果',但它的行为如同'_ <:水果' – Jatin 2013-02-15 12:16:12
不,它的行为不如'_ <:Fruit'。如果是这样,'new Object :: d'将不起作用(实际上它确实)。 – 2013-02-15 13:03:29
我尝试重写它:该方法需要一个'B'类型的参数,它是'A'的非严格*超类型,即'B>:A'。结果列表将具有*最具体的常见超类型*。例如。当'A = Fruit'和'B = Mango'时,你最终会得到一个List [水果];当'A = Fruit'和'B = Plant'时,你得到一个'List [Plant]'。总结一下:该方法的目的是让你建立更通用的类型容器,而不是限制你添加一个特定的子类型(顺便说一下,这是不可能的,因为每个Liskov都是可能的) – 2013-02-15 13:30:24