scala> class A[T]
defined class A
scala> class B[T](a: A[T])
defined class B
scala> val b = new B(new A[Int])
b: B[Int] = B@1ff8982d
大!我可以从B
的实例创建A
的实例。有一个例外。对于A[Nothing]
的实例,类型推断失败。
scala> val b = new B(new A[Nothing])
<console>:9: error: type mismatch;
found : A[Nothing]
required: A[T]
Note: Nothing <: T, but class A is invariant in type T.
You may wish to define T as +T instead. (SLS 4.5)
val b = new B(new A[Nothing])
手动指定类型。
scala> val b = new B[Nothing](new A[Nothing])
b: B[Nothing] = B@3aad5958
我应该为它提交一个错误,还是一个故意的陷阱来吓跑那些对Scala缺乏足够决心的程序员?
答案 0 :(得分:0)
答案在编译反馈中。您需要将A声明为T中的协变,因此当您在构造新B期间未指定type参数时,编译器可以推断A [Nothing]可以被视为类型T(或处理A [T]参数为T)。这是协方差背后的基本思想。
答案 1 :(得分:-1)
自2008年以来,这一点已被人们所知并被忽略为issue SI-1570。假设没有人将Scala用于任何严重的事情。