清单与ClassManifest。这个Scala错误是什么意思?

时间:2011-02-14 10:45:44

标签: scala manifest scala-2.8

这个错误是什么意思?

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 个答案:

答案 0 :(得分:5)

好的,让我们考虑一些事情。第一:

type T = { def x: Int }

此类型称为结构类型。它不是定义一个类,而是一组共享具有特定类型签名的方法的对象。在运行时,它被删除到Object,并且对x的任何调用都是通过反射完成的,因为Java没有任何等价物。

下一步:

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

请注意,您没有使用new Array,而是Array。这是对Scala的apply对象的Array方法的调用。此方法需要ClassManifest隐式参数,该参数将告诉Scala如何创建数组。这是必要的,因为在Java中数组不会被删除,所以Scala必须为Java提供精确的类型。

这就是问题所在:Java中没有这种类型。

我想知道Scala是否不可能在这里使用Object。票证可能是有序的,但不要指望它是可能的。