这个错误是什么意思?
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 })
^
我没有线索......
答案 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
。票证可能是有序的,但不要指望它是可能的。