2012-05-05 23 views
0

这里的问题:我有jar包含编译的scala代码。在罐子我看到Intellij的想法不能解决包含类的美元

Step.class 步骤$ class.class

这都是合法的Java类。

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

+0

是的。顺便说一句,我使用11.0 intellij-idea。 – Vladimir

+0

在这种情况下,我会尝试11.1.1,如果你怀疑它的错误。 –

+0

与11.1.1相同,它只是忽略所有$ containsig类。 – Vladimir

回答

0

Ups,傻我,我只是无效所有的缓存和重新导入罐子,现在它得到解决。

1

与Java接口不同,Scala特征可以包含实现。 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插件不暴露实现类的Java代码。直接使用它并不是一个好主意,因为您依赖于Scala编译器的实现细节。

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

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

相关问题