[英]Scala type parameter inference fails for Nothing
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
大! 我可以從A
實例創建B
的實例。 有一個例外。 對於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期間未指定type參數時,編譯器可以推斷A [Nothing]可以被視為類型T(或處理A [T]參數為T)。 這是協方差背后的基本思想。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.