Это то, что часто смущает начинающих. Недавно был очень похожий вопрос о Software Engineering.SE . Ответ прост: МАГИЯ!
Да, действительно.
Компилятор Scala не обязан соблюдать правила языка Scala. В некотором смысле, это является правилами языка Scala! Он должен реализовывать и применять их, но не должен следовать им. И это, безусловно, не должно следовать правилам языка Java.
Таким образом, способ, которым это происходит, действительно прост: всякий раз, когда какая-то программа Scala делает что-то, что зависит от поведения java.lang.String
, как если бы это был подкласс scala.AnyRef
, она генерирует код, который ведет себя так, как если бы java.lang.String
было подкласс scala.AnyRef
.
Вот и все.
Вы также можете спросить, как Scala создает объекты примитивов Java, которые являются экземплярами классов, которые являются подклассами scala.AnyVal
. Или вы можете спросить, как вы, программист, можете видеть частные реализации двух классов, когда открываете исходный код двух файлов в двух окнах редактора, даже если язык говорит, что вы не можете видеть частные реализации извне.
Причина всегда одна и та же: поскольку вы сидите вне языка, языковые правила к вам не относятся.
С другой стороны, люди часто спрашивают, почему они могут создавать подклассы sealed
классов из Java или вызывать методы, объявленные как private[this]
. Причина снова та же: потому что компилятор Java не должен играть по правилам Scala. Он даже не знает о правилах Скалы.