Как я могу передать ссылку на объект Scala в Java? - PullRequest
10 голосов
/ 02 октября 2010

Я хочу вернуть из метода Java ссылку на объект Scala.Как я могу это сделать?

Мои объекты Scala выглядят так:

trait Environment 

object LocalEnvironment extends Environment {...}
object ServerEnvironment extends Environment {...}

... и я хочу, чтобы мой метод Java был таким:

Environment getEnvironment() { return LocalEnvironment; }  // DOES NOT COMPILE

Есть ли способ сделать это?

Ответы [ 2 ]

23 голосов
/ 02 октября 2010

Несмотря на то, что метод $ .MODULE $ работает, немного менее резкий способ получить Java-взаимодействие с объектами Scala состоит в том, чтобы представить объект как метод сам по себе.

Scala:

object LocalEnvironment extends Environment{
   def instance = this
}

Java:

Environment getEnvironment() { return LocalEnvironment.instance(); }  

Это работает, потому что .instance () реализован как статический метод в классе LocalEnvironment.Было некоторое обсуждение о том, что объекты Scala получают метод «экземпляра» по умолчанию именно для этой цели.

20 голосов
/ 02 октября 2010
{ return LocalEnvironment$.MODULE$; }

должно работать.


Редактировать: причина, по которой это работает, заключается в том, что именно так Scala представляет одноэлементные объекты.Класс ObjectName$ имеет поле с именем MODULE$, которое заполняется единственным допустимым экземпляром этого класса.Но есть также класс с именем ObjectName, который копирует все методы как статические.Таким образом, вы можете использовать его как Java (просто вызовите ObjectName.methodName) в большинстве случаев, и Scala получает реальный класс для передачи.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...