Статические члены класса Java и совместимость Scala - PullRequest
2 голосов
/ 28 марта 2012

Из обзора языка программирования 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 ]

4 голосов
/ 28 марта 2012

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

X.Y()

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

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

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

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

val x = X

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

1 голос
/ 28 марта 2012

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

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

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

...