2012-03-28 3 views
2

От Ан Обзор языка программирования Scala, Second Edition:Java Статические члены класса и 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 байт-код, но я не уверен, что именно делает это означает, жирный текст в верхний BLOCKQUOTE «рассматривается в Scala» для противоположного примера (из Java в Scala).

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

+1

Связано с вашим редактированием: И вопрос в том, что? ;) – Nicolas

+0

Означает ли это, что классы Java со статическими членами фактически преобразуются или просто интерпретируются как две сущности в Scala? Или оба моих предположения ошибочны? :) – PrimosK

+0

Вопрос остается тем же .. :) – PrimosK

ответ

4

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

X.Y() 

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

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

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

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

val x = X 

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

1

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

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

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