Ответ 1
Существует поток списка рассылки, на который ответил Мартин:
Это соответствует JVM. Вы можете опустить инициализацию поля, но не инициализацию локальной переменной. Опускание локальных инициализаций переменных означает, что компилятор должен иметь возможность синтезировать значение по умолчанию для каждого типа. Это не так просто перед лицом параметров типа, специализации и т.д.
При нажатии на то, как происходит или должно быть какое-либо различие между полями и локалями в вопросе Scala, синтезирующих значения по умолчанию, он продолжал говорить:
В терминах байт-кодов существует явная разница. JVM инициализирует поля объекта по умолчанию и требует, чтобы локальные переменные инициализировались явно. [...] Я не уверен, следует ли нам разбить полезный принцип Java (locals должны быть инициализированы до того, как они будут использованы), или нам лучше пойти на полную длину и внедрить проверку инициализации на основе потоков, как в Java. Это было бы лучшим решением, ИМО, но для этого потребовалась бы значительная работа с точки зрения спецификации и реализации. Столкнувшись с этими выборами, мой естественный инстинкт теперь ничего не делает: -)
Итак, если я правильно понимаю, компилятор Scala фактически не синтезирует значения по умолчанию для полей объекта, он создает байт-код, который оставляет JVM для обработки этого.
В соответствии с SI-4437 было достигнуто согласие Мартина о фактическом одобрении шаблона null.asInstanceOf[T]
в спецификации языка, казалось бы, из-за отсутствия способных реально поддерживать лучшую альтернативу в рамках существующих ограничений.