我想从Java方法返回对Scala对象的引用。我怎么能这样做?
我的Scala对象是这样的:
trait Environment
object LocalEnvironment extends Environment {...}
object ServerEnvironment extends Environment {...}
...我希望我的Java方法是这样的:
Environment getEnvironment() { return LocalEnvironment; } // DOES NOT COMPILE
有办法做到这一点吗?
答案 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如何表示它内部。