Манифест против ClassManifest.Что означает эта ошибка Scala? - PullRequest
3 голосов
/ 14 февраля 2011

Что означает эта ошибка?

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 Ответ

5 голосов
/ 14 февраля 2011

Хорошо, давайте рассмотрим пару вещей.Первый:

type T = { def x: Int }

Этот тип известен как структурный тип .Он определяет не класс, а набор объектов, которые совместно используют методы с определенной сигнатурой типа.Во время выполнения он стирается до Object, и любые вызовы x выполняются с помощью отражения, поскольку Java не имеет никакого аналога.

Далее:

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

Обратите внимание, что вы не использовали new Array, но Array.Это вызов метода apply объекта Scala Array.Этот метод требует неявного параметра ClassManifest, который сообщит Scala, как создать массив.Это необходимо, потому что массивы не стираются в Java, поэтому Scala должна предоставить точный тип Java.

И вот в чем проблема: в Java такого типа нет.

Интересно, а у Scala было бы невозможно использовать Object здесь?Билет может быть в порядке, но не рассчитывайте, что это возможно.

...