Статические члены класса 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
поле класса JavaSystem
и вызывает его (перегружен)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, где статические и нестатические члены находятся в одном классе.
Таким образом, ваше второе предположение верно, первое неверно.
Я предполагаю, что использование книги видят вместо интерпретации, потому что последняя может иметь другое значение, если вы думаете о "интерпретируемых языках" (которые в этом контексте не имеют смысла).