私はこのような簡単なプログラムがあります:あなたはそれは絶対に何もしません見ることができるようにJavaのジェネリック - 汎用的な機能を持つジェネリッククラスを拡張
package test;
public class TestGenericsInheritance {
public static void main(String[] args) {}
public static abstract class A<Q>{
public void foo2(Q obj){}
public abstract <T> void foo(T obj);
}
public static class C extends A<Object>{
@Override
public <T> void foo(T obj) {}
}
public static class B extends A{
@Override
public <T> void foo(T obj) {}
}
}
を。次のエラーでJava 1.6および1.7でこのプログラムファイルの編集:
/D:/Projects/.../test/TestGenericsInheritance.java:[24,19] test.TestGenericsInheritance.B is not abstract and do es not override abstract method foo(java.lang.Object) in test.TestGenericsInheritance.A /D:/Projects/.../test/TestGenericsInheritance.java:[27,25] name clash: foo(T) in test.TestGenericsInheritance .B and foo(T) in test.TestGenericsInheritance.A have the same erasure, yet neither overrides the other /D:/Projects/.../test/TestGenericsInheritance.java:[26,9] method does not override or implement a method from a supertype
クラスCとBは、しかし、クラスBは、#fooの実装としてメソッドfooを認識しない、意味的に同じです。このコードを作るために準拠した私は、メソッドに次のシグネチャを持つクラスBに#FOOを実装する必要があります。
public void foo(Object obj)
私のプログラムがコンパイルできない理由私の質問は、ありますか?ジェネリック型QとTは完全に独立しているので、ジェネリック関数A#fooは、継承クラスAのジェネリック型Qを明示的に指定した場合にのみ実装できます。
おかげ
私はrepro 'することができます。さらに、非ジェネリックメソッドとジェネリックメソッドを同時に持つと、同じタイプのイレージャを持つエラーが発生します。 – 4castle
Eclipseは、 '' '@Override public void foo(Object obj){}' 'を' '' B'''に追加することを提案しています。 (1.8) –
@ 4castleあなたが編集したファイルでは、削除したソースファイル名にエラーメッセージが混乱します。 –