【问题标题】:Permanently hidden warning from Scalac parsing Java code - compiler bug?Scalac解析Java代码的永久隐藏警告-编译器错误?
【发布时间】:2011-05-30 11:32:12
【问题描述】:

scalac Java 解析器反对我的 Java 代码

imported `Entity' is permanently hidden by definition of object Entity in package domain    Asset.java

这似乎是导入和正在编译的包中同名的类之间的冲突。

在我的包里我有一个类

package iMP2020.domain;

public interface Entity {
    public Serializable getId();
}

与来自不同包的导入类同名

package iMP2020.domain;
import javax.persistence.Entity; // compiler warning

@Entity
public class Asset {

它在哪里抱怨导入。 Javac 很高兴。请注意,我不必引用我的类版本 - 只要它的存在就足以触发导入警告。

我可以通过删除导入并显式引用@Entity 来解决此问题,但这是否是编译器中的错误?

【问题讨论】:

  • 不管是不是bug,你为什么用Scala编译器编译Java代码而不是Java编译器?不管 javac 或 scalac 是否不符合 Java 规范(或者该行为是否未被规范涵盖),如果您想要 javac 行为,请使用 javac?
  • 因为 scalac 解析 Java 源代码是为了推断类型签名,以便我们可以在 Java 和 Scala 之间建立循环依赖关系 - codecommit.com/blog/scala/…
  • 换句话说,“我在 Java 和 Scala 之间有一个无法解决的循环依赖关系,但无论如何我都可以用 javac 成功编译它,这就是我知道 javac 不会抱怨的原因?”我不知道这是否是一个错误,但不管怎样,你有一个解决方法很好。
  • 不知道是不是bug,但鉴于是警告而不是错误,Scala编译器并没有违反Java规范。
  • @Rex 其实我没有任何无法解析的依赖,所以 javac 编译这个就好了。

标签: java scala scalac


【解决方案1】:

除了使用 Scala Eclipse 插件外,我似乎无法重现此问题,因此我将等待其稳定后再得出结论。

【讨论】:

  • 尝试“导入 javax.persistence”,然后在代码中将其用作 javax.persistence.Entity。
【解决方案2】:

您有两个Entity 引用,一个用于您的界面,另一个用于javax.persistence.Entity

尝试用完整的限定名替换第二个,删除导入:

package iMP2020.domain;

public interface Entity {
    public Serializable getId();
}

package iMP2020.domain;

@javax.persistence.Entity
public class Asset {

【讨论】:

    【解决方案3】:

    我不认为这是一个错误。 导入与包成员同名是没有意义的。

    【讨论】:

    • 好吧,如果我在另一个包中有一个与我的包中的类同名的类,这确实有意义。当然 javac 应该是这里的仲裁者,它不会发出警告。
    • @Duncan,对不起,我的意思是编译器允许您使用 2 个具有相同名称的类是没有意义的。可能是 javac 期望您使用完全限定的类名来引用导入。
    • 请注意,我不必引用当前包中的类。仅它的存在就足以触发导入警告。在上述代码的情况下,javac 只考虑显式导入并且不给出警告。 Scalac 抱怨。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-12
    • 1970-01-01
    相关资源
    最近更新 更多