Статические члены класса Java и совместимость Scala

Из обзора языка программирования Scala, второе издание:

// Scala
object PrintOptions {
    def main(args: Array[String]): Unit = {
        System.out.println("Options selected:")
        for (val arg <- args)
            if (arg.startsWith("-"))
                System.out.println(" " + arg.substring(1))
    }
}

В приведенном выше примере программа Scala вызывает методы startsWith а также substring из String, который является классом, определенным в Java. Он также получает доступ к статическим out поле класса Java Systemи вызывает его (перегружен) println метод. Это возможно, даже если в Scala нет концепции статических членов класса. Фактически, каждый класс Java рассматривается в Scala как две сущности: класс, содержащий все динамические элементы, и одноэлементный объект, содержащий все статические члены.

Я понимаю перевод сопутствующих объектов Scala в байт-код Java, но я не уверен, что именно означает, что это означает жирный текст в верхнем блок-кавычке "видно в Scala" для противоположного примера (от Java до Scala).

Означает ли это, что классы Java со статическими членами на самом деле преобразуются или просто интерпретируются как два объекта в Scala? Или оба моих предположения неверны?

2 ответа

Решение

Я думаю, что вы можете быть ослеплены предположениями Java. Рассмотрим этот простой фрагмент кода:

X.Y()

Означает, что метод Y вызывается на объекте Xили на каком-то другом объекте, который X был неявно преобразован в.

Может быть, это не выглядит удивительным, или вы не видите ничего плохого в этом, поэтому давайте прямо заявим о следствии: X НИКОГДА не будет классом. Вы не вызываете методы на классах, точка.

Естественно, это представляет серьезную проблему взаимодействия с Java в отношении статических членов, и поэтому утверждается, что статические члены класса Java X будет "рассматриваться" как одноэлементный объект: иначе вы никогда не сможете их использовать.

Обратите внимание, что одноэлементные объекты Scala являются настоящими объектами - они являются экземплярами одноэлементных классов. Классы Java со статическими членами, однако, не будут давать начало отдельным объектам. На практике это означает, что эта строка:

val x = X

будет работать, если X является одноэлементным объектом Scala, но не будет работать, если это Java-класс со статическими членами.

Это просто означает, что Scala ничего не меняет на исходный код Java, где статические и нестатические члены находятся в одном классе.

Таким образом, ваше второе предположение верно, первое неверно.

Я предполагаю, что использование книги видят вместо интерпретации, потому что последняя может иметь другое значение, если вы думаете о "интерпретируемых языках" (которые в этом контексте не имеют смысла).

Другие вопросы по тегам