【问题标题】:Intellij idea cannot resolve dollar containing classesIntellij idea 无法解析包含美元的类
【发布时间】:2012-05-05 09:13:13
【问题描述】:

问题出在这里:我有一个包含已编译 scala 代码的 jar。在罐子里我看到了

Step.class 步骤$class.class

它们都是合法的 java 类。

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

【问题讨论】:

  • 是的。顺便说一句,我使用 11.0 intellij-idea。
  • 在这种情况下,如果您怀疑它是一个错误,我会尝试 11.1.1。
  • 11.1.1 也一样,只是忽略了所有 $ containsig 类。
  • 我会将它作为一个错误记录到 Jetbrains,即使您使用的是免费版本,它们通常也会相当敏感。 jetbrains.com/support/idea/index.html

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


【解决方案1】:

Scala 特征可以包含实现,这与 Java 接口不同。 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 编译器的实现细节。

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

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

【讨论】:

    【解决方案2】:

    哎呀,我傻了,我刚刚使所有缓存和重新导入的 jar 无效,现在它得到了解决。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-24
      • 2021-12-29
      相关资源
      最近更新 更多