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

时间:2010-10-02 12:39:54

标签: java scala interop

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

我的Scala对象是这样的:

trait Environment 

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

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

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

有办法做到这一点吗?

2 个答案:

答案 0 :(得分:23)

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

斯卡拉:

object LocalEnvironment extends Environment{
   def instance = this
}

Java:

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

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

答案 1 :(得分:20)

{ return LocalEnvironment$.MODULE$; }

应该有用。


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

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