来自Java代码的嵌套Scala单例

时间:2010-08-24 18:24:56

标签: java scala

我有以下Scala(2.8)代码:

object A {
  val message = "hello"
  object B {
    val message = "world"
  }
}

类似的Java类:

public class C {
  public static String message() {
    return "HELLO";
  }
  public static class D {
    public static String message() {
      return "WORLD";
    }
  }
}

当我从Scala调用它们时,这些工作正如我所期望的那样:

scala> A.message  
res0: java.lang.String = hello

scala> A.B.message
res1: java.lang.String = world

scala> C.message  
res2: java.lang.String = HELLO

scala> C.D.message
res3: java.lang.String = WORLD

但是当我尝试类似Java的东西时,编译器不喜欢第二行:

System.out.println(A.message());
System.out.println(A.B.message()); // cannot find ... symbol  : variable B ...
System.out.println(C.message());
System.out.println(C.D.message());

当我用javap查看类文件时,很清楚为什么会出现这种情况。我知道我可以使用

System.out.println(A$B$.MODULE$.message());

,或者将val getB = B之类的内容添加到我的A对象中,并用

替换第二行
System.out.println(A.getB().message());

是否有一种标准方法可以使用Java代码中嵌套的Scala单例对象?

2 个答案:

答案 0 :(得分:2)

我对Scala知之甚少,但考虑到the way Scala is compiled into bytecode,我认为你已经暴露了你唯一的两个选择。

答案 1 :(得分:0)

Scala 2.12中的语法略有不同:

给出Scala

object A {
  object B {
    val message = "world"
  }
}

然后可以通过

从Java访问message
A.B.MODULE$.message();