Хорошо, давайте рассмотрим пару вещей.Первый:
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
здесь?Билет может быть в порядке, но не рассчитывайте, что это возможно.