簡體   English   中英

Nala的Scala類型參數推斷失敗

[英]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)。 這是協方差背后的基本思想。

自2008 以來,這已被人們所熟知並被忽視為問題SI-1570 。假設沒有人將Scala用於任何嚴肅的事情。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM