The following Scala example defines a class inside a package object:
package com.mycompany
package object test {
class MyTest {
def foo(): Int = {
42
}
}
}
The following three classes are generated:
com/mycompany/test/package.class
com/mycompany/test/package$.class
com/mycompany/test/package$MyTest.class
The problem arises when trying to use the MyTest
class from Java. I think that since package$MyTest
contains a $ in the name, Java is not acknowledging its existence. Nevertheless, the package$
class is accessible.
Running javap
on package$MyTest.class
returns:
Compiled from "Test.scala"
public class com.mycompany.test.package$MyTest {
public int foo();
public com.mycompany.test.package$MyTest();
}
I've tried accessing the class using Eclipse, Intellij and Netbeans, without success. Is it possible to use Scala classes defined in package objects from Java?
Defining a class inside the package object
test
is currently not implemented the same way as defining it inside the packagetest
, although it probably should (this is being tracked as SI-4344).Because of that, it is usually good practice to place into the package object only definitions that cannot be top level, like vals, defs, etc. (this is the whole point of package objects after all), and leave class/object definitions into a normal package definition:
This will produce a normal
MyTest
class, easily accessible from Java:package$MyTest
follows JVM convention for nested classes, so it would be visible aspackage.MyTest
... except this isn't a legal name in Java. Which means it can't be accessed.