Nala的Scala类型参数推断失败

时间:2014-07-22 12:13:03

标签: scala type-inference

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缺乏足够决心的程序员?

2 个答案:

答案 0 :(得分:0)

答案在编译反馈中。您需要将A声明为T中的协变,因此当您在构造新B期间未指定type参数时,编译器可以推断A [Nothing]可以被视为类型T(或处理A [T]参数为T)。这是协方差背后的基本思想。

答案 1 :(得分:-1)

自2008年以来,这一点已被人们所知并被忽略为issue SI-1570。假设没有人将Scala用于任何严重的事情。