Intellij想法无法解析包含美元的类

时间:2012-05-05 09:13:13

标签: java scala intellij-idea scala-java-interop

这里的问题是:我的jar包含已编译的scala代码。我在罐子里看到

Step.class 步骤$ class.class

这两个都是合法的java类。

然而,当我尝试在Intellij Idea java项目中使用Step $ class时,它说:“无法解析符号Step $ class”。但代码是用maven编译的,所以我认为问题出在IDE中。

2 个答案:

答案 0 :(得分:1)

与Java接口不同,Scala traits可以包含实现。 scalac将其编译为接口和实现类:

  ~/code/scratch/20120505 cat trait.scala 
package test

trait T {
    def a = println("foo")
}
  ~/code/scratch/20120505 scalac210 -d . trait.scala 

  ~/code/scratch/20120505 javap -classpath . test/T
Compiled from "trait.scala"
public interface test.T extends scala.ScalaObject{
    public abstract void a();
}

  ~/code/scratch/20120505 javap -classpath . test/T\$class
Compiled from "trait.scala"
public abstract class test.T$class extends java.lang.Object{
    public static void a(test.T);
    public static void $init$(test.T);
}

IntelliJ Scala插件不会将实现类公开给Java代码。直接使用它并不是一个好主意,因为您依赖于Scala编译器的实现细节。

您应该在特征的子类上调用相应的方法。但是,您必须在Scala中编写它。

更多信息:How are Scala traits compiled into Java bytecode?

答案 1 :(得分:0)

Ups,愚蠢的我,我刚刚使所有缓存无效并重新导入了jar,现在它得到了解决。