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

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

我的Scala对象是这样的:

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

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

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

有没有办法做到这一点?

 { return LocalEnvironment$.MODULE$; } 

应该管用。


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

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

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

斯卡拉:

 object LocalEnvironment extends Environment{ def instance = this } 

Java:

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

这是有效的,因为在底层,.instance()是作为LocalEnvironment类的静态方法实现的。 为了这个目的,有一些关于Scala对象默认获得“实例”方法的讨论。