在Java中导入对象内的Scala对象

4sup72z8  于 2022-11-09  发布在  Scala
关注(0)|答案(1)|浏览(194)

我在Scala中的另一个对象中有一个对象,我想用Java导入它。设置如下所示:
Scala:

package scalapart;

object Outer {
    object Inner {
        def method: String = "test"
    }
}

Java:

import scalapart.Outer.Inner;
...
Outer.Inner.method()

不幸的是,我在Java代码的第1行得到了cannot find symbol。如果I import scalapart.Outer;,则第二行报告相同的问题。
有没有办法在Java中导入在另一个Scala对象中定义的Scala对象?

ijnw1ujt

ijnw1ujt1#

您可以直接使用它:

// assuming they are in the same package:
    String mystr = Outer.Inner$.MODULE$.method();
    System.out.println(mystr);  // test

    // if in other package just:
    import packageName.Outer;

    String mystr = Outer.Inner$.MODULE$.method();

或者使用static import,如下所示(或类似):

import static packageName.Outer.Inner$.MODULE$;

String mystr = MODULE$.method();

Java没有任何与Singleton对象直接等价的东西,因此对于每个Scala Singleton对象,编译器都会为该object创建一个同名的合成Java类(在末尾附加一个美元符号),并创建一个名为MODULE$static字段来保存该类的单个示例。因此,为了确保一个对象只有一个示例,Scala使用了静态类保持器。
您的反汇编代码如下所示:

public final class Outer
{
    public static class Inner$
    {
        public static final Inner$ MODULE$;

        static {
            MODULE$ = new Inner$();
        }

        public String method() {
            return "test";
        }
    }
}

public final class Outer$ {
    public static final Outer$ MODULE$;

    static {
        MODULE$ = new Outer$();
    }

    private Outer$() {
    }
}

相关问题