Scala 与差异混淆

Scala 与差异混淆,scala,variance,Scala,Variance,鉴于以下情况: trait Fruit class Apple extends Fruit class Orange extends Fruit case class Crate[T](value:T) def p(c:Crate[Fruit]) { } val cra = Crate(new Apple) val cro = Crate(new Orange) 由于板条箱是不变的,我无法执行以下操作(如预期的那样): 我是否遗漏了方差的一些基本原理?在后一种情况下,编译器假定您希望

鉴于以下情况:

trait Fruit

class Apple extends Fruit
class Orange extends Fruit

case class Crate[T](value:T)

def p(c:Crate[Fruit]) {  }

val cra = Crate(new Apple)
val cro = Crate(new Orange)
由于板条箱是不变的,我无法执行以下操作(如预期的那样):


我是否遗漏了方差的一些基本原理?

在后一种情况下,编译器假定您希望它工作,并实际说

p(Crate( (new Apple): Fruit ))
这完全可以。这与手动操作相同

val f: Fruit = new Apple   // totally fine
p(Crate(f))                // Also totally fine

这只是编译器应用的巨大魔法的一小部分,编译器可以在不让您全部输入的情况下,尝试找出您对类型的含义。

谢谢。当编译器假定开发人员希望它工作时,它几乎似乎是在短路方法p的Crate不变性。我假设板条箱必须定义为板条箱[+T],才能使p方法与cro、cra一起工作。@ssanj-你是对的,它必须定义为
+T
,才能与
cro
cra
一起工作,这两种方法已经分配了它们的类型。但是,当您没有指定类型并生成新的内容时,它会假定您想要一些有意义的内容,前提是需要有意义的内容。
p(Crate( (new Apple): Fruit ))
val f: Fruit = new Apple   // totally fine
p(Crate(f))                // Also totally fine