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如何在内部表示它.