What does this error mean?
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 })
^
I don't have a clue ...
Ok, let's consider a couple of things. First:
This type is known as a structural type. It defines not a class, but a set of objects that share methods with a certain type signature. At run-time, it is erased to
Object
, and any calls tox
are done through reflection, since Java doesn't have any equivalent to it.Next:
Note that you did not use
new Array
, butArray
. That is a call to theapply
method of Scala'sArray
object. This method requires aClassManifest
implicit parameter that will tell Scala how to create the array. This is necessary because arrays are not erased in Java, so Scala has to provide the precise type to Java.And here's the problem: there's no such type in Java.
I do wonder if it wouldn't be possible for Scala to use
Object
here. A ticket might be in order, but don't count on it being possible.