10
考慮下面的代碼片段:無法推斷逆變全無類型參數
trait X[-T]
object Y extends X[Nothing]
def a[T](x: X[T]): X[T] = x
a(Y)
以上(2.12.3)的編譯失敗:
type mismatch;
found : Y.type
required: X[T]
a(Y)
^
編譯沒有問題,如果:
- 使用與
Nothing
不同的類型(例如object Y extends X[String]
) - 方法
a
在其返回類型中不使用T
(例如,def a[T](x: X[T]): Unit = {}
) - 爲
a
類型參數明確給出(即a[Nothing](Y)
) T
是協變,不逆變(也失敗,如果它是不變的)
這是編譯器爲Nothing
一些特殊的情況下?
作爲一個「有趣」的變通,下面似乎很好地工作:
trait X[-T]
object Y extends X[Nothing]
def a[T, U <: T](x: X[T]): X[U] = x
a(Y)
感謝您的回答,但爲什麼使用String而不是Nothing來讓示例編譯?或者爲什麼解決方法工作? – adamw