2011-02-14 12 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。票可能是为了,但不要指望它是可能的。