8
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)と同じ消去がありますが、非表示にはなりません」

4

2 に答える 2

5

メソッドが静的でなくても、stonedsquirrel の回答に加えて、同じエラーが発生します。

これは Type Erasure が原因で、互換性のない型で convert をオーバーライドしようとしている可能性があります。

わかりやすい説明については、次の回答を確認してください。

于 2013-09-25T07:40:22.063 に答える
2

Java では、静的メソッドのオーバーライドは許可されていません。Java が静的メソッドのオーバーライドを許可しないのはなぜですか? を参照してください。

できることは、サブクラスの静的メソッドを非表示にすることだけです。非表示とは、呼び出されたオブジェクトのタイプに依存するのではなく、クラスのタイプに依存することを意味します。http://docs.oracle.com/javase/tutorial/java/IandI/override.htmlを参照してください。

ここでの問題は、サブクラス メソッドが正式には同じシグネチャを持っているが、ジェネリック型のためにそれを隠していないことです。正確で明確な隠蔽を実際に防止Collection<? extends ArithmeticExpression>するのと同じでもサブタイプでもありません。AyobiCollection<? extends Expression>が指摘したように、下位互換性を確保するためにコンパイラ ルールが導入されました。

今は自分で試すことはできませんが、両方が同じジェネリック型を持つ場合、エラーは消えるはずです。Java 5 でエラーが発生しない理由はわかりませんが、以前は気付かなかったので、後のバージョンでそのコンパイラ ルールが導入されたのでしょう。

于 2013-09-25T07:32:21.793 に答える