【问题标题】:How can I provide a scala companion object's class to Java?如何向 Java 提供 scala 伴随对象的类?
【发布时间】:2014-12-23 22:55:45
【问题描述】:

我有一个在类的静态方法中查找注解的 Java 代码。

processor.readStatics( MyClass.class );  // Takes Class<?>

如何在 scala 中向该函数提供 scala 伴随对象的方法?

class MyClass {
}
object MyClass {
  def hello() { println("Hello (object)") } 
}

我觉得:

MyClass$.MODULE$.getClass()

应该是answer。但是,MyClass$ 似乎在 scala 中缺失(至少在 2.10 中),并且仅对 Java 可见。

println( Class.forName("MyClass$.MODULE$") )

也失败了。

【问题讨论】:

  • 你试过Class.forName("MyClass$MODULE$")吗?对于内部类,不需要额外的.
  • Class.forName("MyClass$$MODULE$"),因为对于内部类,我们必须使用$ 而不是.
  • 嗯,使用Class.forName(MyClass$) 返回的类可能就足够了。至少在 Scala 2.10.3 中可以找到它。

标签: scala static-methods scala-java-interop


【解决方案1】:

类名是MyClass$(前面带有适当的包名)。

println(Class.forName("MyClass$")) 将打印出“class MyClass$”。

MyClass$.MODULE$ 是类的instance,引用单例对象。

println(MyClass$.MODULE$ == MyClass) 将打印出“true”,即使在编译时,您会收到一条警告,指出这种比较总是产生 false :)

请注意,由于某种原因,这些都不适用于 repl。您需要实际创建一个 .scala 文件,使用 scalac 编译它,然后运行。

所以,在java中,使用MyClass$静态引用MyClass对象的类,使用MyClass$.MODULE$引用MyClass对象的单例实例,使用MyClass$.classMyClass$.MODULE$.getClass()引用类动态的单例对象,使用Class.forName("MyClass$")在运行时按名称访问它。

【讨论】:

    【解决方案2】:

    最短且类型最安全的解决方案是简单地使用

    MyClass.getClass
    

    我希望以下内容能够正常工作,但显然 scalac 对此并不满意:

    classOf[MyClass.type]
    

    【讨论】:

      猜你喜欢
      • 2018-02-06
      • 1970-01-01
      • 1970-01-01
      • 2016-02-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多