Scala 类型参数推理因 Nothing 失败

2024-05-04

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


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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Scala 类型参数推理因 Nothing 失败 的相关文章

随机推荐