如何在Java中传递Scala对象引用?

Dav*_*vid 10 java interop scala

我想从Java方法返回对Scala对象的引用.我怎样才能做到这一点?

我的Scala对象是这样的:

trait Environment 

object LocalEnvironment extends Environment {...}
object ServerEnvironment extends Environment {...}
Run Code Online (Sandbox Code Playgroud)

...我希望我的Java方法是这样的:

Environment getEnvironment() { return LocalEnvironment; }  // DOES NOT COMPILE
Run Code Online (Sandbox Code Playgroud)

有没有办法做到这一点?

Dav*_*ith 23

虽然$ .MODULE $方法有效,但是使用Scala对象获得Java-interop的一种稍微不那么刺耳的方法是将对象作为一种方法暴露给自己.

斯卡拉:

object LocalEnvironment extends Environment{
   def instance = this
}
Run Code Online (Sandbox Code Playgroud)

Java:

Environment getEnvironment() { return LocalEnvironment.instance(); }  
Run Code Online (Sandbox Code Playgroud)

这是有效的,因为在底层,.instance()是作为LocalEnvironment类的静态方法实现的.出于此目的,已经有一些关于Scala对象默认获得"实例"方法的讨论.


Rex*_*err 20

{ return LocalEnvironment$.MODULE$; }
Run Code Online (Sandbox Code Playgroud)

应该管用.


编辑:这就是为什么Scala代表单例对象的原因.该类中ObjectName$有一个字段,调用MODULE$该字段填充该类的单个有效实例.但是还有一个叫做ObjectName复制所有方法的类作为静态方法.这样你就可以ObjectName.methodName在大多数情况下像Java一样使用它(只是调用),并且Scala可以拥有一个真正的类来传递.

但是当Java需要传递类时 - 不是通常用一堆静态方法完成的,这是object用Java模拟的 - 你必须知道Scala如何在内部表示它.