【问题标题】:Name Clash compile error when compiled in java 7 but works fine in java 5在 java 7 中编译时名称冲突编译错误,但在 java 5 中工作正常
【发布时间】:2013-09-25 07:00:26
【问题描述】:
public interface Expression {

}

public interface ArithmeticExpression extends Expression {

}


public class StaticMethodDemo {
  public static void print(Expression e) {
    System.out.println("StaticMethodDemo");
  }

  public static List<Expression> convert(
        Collection<? extends Expression> input) {
    return null;
 }
}


public class StaticMethodChild extends StaticMethodDemo {

    public static void print(ArithmeticExpression e) {
    System.out.println("StaticMethodChild");
   }

   public static List<ArithmeticExpression> convert(
        Collection<? extends ArithmeticExpression> input) {
    return null;
  }
}

上面的代码在 java 5 中编译,但在 java 7 中没有,为什么?在 java 7 中,它给出了“名称冲突:StaticMethodChild 类型的方法 convert(Collection) 与 StaticMethodDemo 类型的 convert(Collection) 具有相同的擦除,但不隐藏它”

【问题讨论】:

    标签: java compiler-errors


    【解决方案1】:

    除了stonedsquirrel的回答,即使方法不是静态的,你也会得到同样的错误。

    这是因为类型擦除,您将尝试使用不兼容的类型覆盖 convert。

    查看以下answer 以获得很好的解释。

    【讨论】:

    • 另一个链接的答案与OP的错误不同,其他答案确实很好地讨论了类型擦除,但它没有提到静态方法和错误的关键位“但是不隐藏”
    【解决方案2】:

    Java 不允许覆盖静态方法。见Why doesn't Java allow overriding of static methods?

    你唯一能做的就是在子类中隐藏一个静态方法。隐藏意味着它不依赖于它被调用的对象类型,而是依赖于什么类型的类。见http://docs.oracle.com/javase/tutorial/java/IandI/override.html

    现在的问题是,您的子类方法在形式上具有相同的签名,但由于泛型类型,它没有隐藏它。 Collection&lt;? extends ArithmeticExpression&gt; 既不是相同的,也不是Collection&lt;? extends Expression&gt; 的子类型,实际上阻止了正确、明确的隐藏。正如 Ayobi 指出的那样,引入了编译器规则以确保向后兼容:Method has the same erasure as another method in type

    目前无法亲自尝试,但当两者具有相同的泛型类型时,错误应该会消失。虽然我不知道为什么 Java 5 中没有出现该错误。我猜他们在以后的版本中引入了该编译器规则,因为他们之前没有注意到它。

    【讨论】:

    • 感谢您的解释。目前我正在做一个项目,我们正在迁移到 Java 7,并且大量的类都有这个问题。除此之外,我还面临具有 vargs 的方法的问题。
    • 你应该明确地重构所有这些类,因为这是错误的来源。
    猜你喜欢
    • 2012-08-25
    • 1970-01-01
    • 2021-04-20
    • 1970-01-01
    • 1970-01-01
    • 2017-04-09
    • 1970-01-01
    • 2012-03-23
    • 1970-01-01
    相关资源
    最近更新 更多