Ich habe ein einfaches Programm wie folgt aus:Java Generics - allgemeine Klasse mit generischen Funktionserweiterungs
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) {}
}
}
wie Sie es absolut nichts sehen. Erstellung dieser Programmdatei auf Java 1.6 und 1.7 mit folgenden Fehlern:
/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
Klassen C und B ist semantisch identisch, aber Klasse B nicht Methode foo als Implementierung von A # foo nicht erkennt. Um diesen Code konform zu machen Ich habe Methode A # foo in der Klasse B mit folgenden Unterschrift zu implementieren:
public void foo(Object obj)
Meine Frage ist, warum mein Programm nicht kompiliert? Die generischen Typen Q und T sind vollständig unabhängig, weshalb kann ich die generische Funktion A # foo nur implementieren, wenn ich explizit den generischen Typ Q für die vererbte Klasse A festlege?
Dank
Ich bin in der Lage zu repro '. Darüber hinaus führt die gleichzeitige Verwendung der nicht-generischen Methode und der generischen Methode zu einem Fehler beim Löschen desselben Typs. – 4castle
Eclipse schlägt vor: '' '@Override public void foo (Object obj) {}' '' '' '' B'' 'das macht es tatsächlich kompilieren. (1.8) –
@ 4castle Ihre Bearbeitung hat die Fehlermeldungen verwirrend gemacht, da sie einen Quelldateinamen erwähnen, den Sie entfernt haben. –