2011-02-14 21 views
3

這個錯誤是什麼意思?Manifest vs ClassManifest。這個Scala錯誤是什麼意思?

scala> val a = Array[{ def x: Int }](new { def x = 3 }) 
<console>:5: error: type mismatch; 
found : scala.reflect.Manifest[java.lang.Object] 
required: scala.reflect.ClassManifest[AnyRef{def x: Int}] 
     val a = Array[{ def x: Int }](new { def x = 3 }) 
            ^

我沒有線索...

+1

看起來像一個編譯器錯誤。 val a = List [{def x:Int}](new {def x = 3})工作正常。 – 2011-02-14 11:28:30

+1

@Eric「List」和「Array」之間有區別,這應該是關於發生了什麼的暗示。 – 2011-02-14 13:30:33

回答

5

好吧,讓我們考慮幾件事情。第一:

type T = { def x: Int } 

這種類型的已知爲結構類型。它不是定義一個類,而是一組共享具有特定類型簽名的方法的對象。在運行時,它被擦除到Object,並且任何對x的調用都是通過反射完成的,因爲Java沒有任何等價物。

下一頁:

val a = Array[{ def x: Int }](new { def x = 3 }) 

請注意,您沒有使用new Array,但Array。這是對Scala的Array對象的apply方法的調用。該方法需要一個隱含參數,它將告訴Scala如何創建該數組。這是必要的,因爲數組在Java中不會被擦除,所以Scala必須爲Java提供精確的類型。

這裏是問題:Java中沒有這種類型。

我不知道Scala是否可能在這裏使用Object。票可能是爲了,但不要指望它是可能的。