使用Java中的包对象中定义的Scala类

Geo*_*iki 6 interop scala object package

以下Scala示例定义了包对象中的类:

package com.mycompany

package object test {
  class MyTest {
    def foo(): Int = {
      42
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

生成以下三个类:

com/mycompany/test/package.class
com/mycompany/test/package$.class
com/mycompany/test/package$MyTest.class
Run Code Online (Sandbox Code Playgroud)

尝试使用MyTestJava中的类时出现问题.我认为,由于package$MyTest名称中包含$,因此Java不承认它的存在.然而,package$课程是可访问的.

javappackage$MyTest.class退货时运行:

Compiled from "Test.scala"
public class com.mycompany.test.package$MyTest {
  public int foo();
  public com.mycompany.test.package$MyTest();
}
Run Code Online (Sandbox Code Playgroud)

我尝试使用Eclipse,Intellij和Netbeans访问该类,但没有成功.是否可以使用Java中的包对象中定义的Scala类?

gou*_*ama 5

包对象中 定义一个类test目前的实现方式与在 内定义它的方式相同test,尽管它可能应该(这被跟踪为SI-4344).

因此,通常优良的做法是只将不能达到顶级的定义放入包对象中,如vals,defs等(毕竟这是包对象的全部要点),并将类/对象定义保留在正常的包装定义:

package com.mycompany

package object test {
  // vals, defs, vars, etc.
  val foobar = 42
}

package test {
  // classes, objects, traits, etc.
  class MyTest {
    def foo(): Int = {
      42
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

这将生成一个普通的MyTest类,可以从Java轻松访问:

com/mycompany/test/MyTest.class
com/mycompany/test/package.class
com/mycompany/test/package$.class
Run Code Online (Sandbox Code Playgroud)