为什么不使用类型参数进行编译:
错误:值爆炸不是Test.A的成员
如果删除它们,则可以编译。我不了解什么,更重要的是,我可以做些什么来解决它。
object Test extends App {
implicit class B[E](set: A[E]) {
def explode() = println("boom")
}
case class A[E](name: String)
A[Nothing]("coldplay").explode()
}
(此示例中的类型参数不执行任何操作,但在实际使用案例中,我有多个类型参数,有些可以为Nothing,有些则为Nothing)。
最佳答案
它真的不喜欢一无所获:
scala> implicit def a2b(a: A[Nothing]): B[Nothing] = new B(a)
<console>:17: error: type mismatch;
found : A[Nothing]
required: A[T]
Note: Nothing <: T, but class A is invariant in type E.
You may wish to define E as +E instead. (SLS 4.5)
implicit def a2b(a: A[Nothing]): B[Nothing] = new B(a)
^
scala> implicit def a2b(a: A[Nothing]): B[Nothing] = new B[Nothing](a)
warning: there were 1 feature warning(s); re-run with -feature for details
a2b: (a: A[Nothing])B[Nothing]
scala> A[Nothing]("coldplay").explode()
boom
-Ytyper-debug
:| | | | | | | solving for (T: ?T)
| | | | | | | |-- $iw.this.X.B BYVALmode-EXPRmode-FUNmode-POLYmode (silent solving: type T: method f in X) implicits disabled
| | | | | | | | [adapt] [T](set: $line3.$read.$iw.$iw.X.A[T])$line3.$read.$iw.$iw... adapted to [T](set: $line3.$read.$iw.$iw.X.A[T])$line3.$read.$iw.$iw...
| | | | | | | | \-> (set: X.A[T])X.B[T]
| | | | | | | solving for (T: ?T, T: ?T)
| | | | | | | \-> <error>
<console>:10: error: value explode is not a member of X.A[Nothing]
def f() = A[Nothing]("coldplay").explode() }