Mam prosty program tak:Java rodzajowych - rozszerzenie klasy rodzajowe z funkcją rodzajowy
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) {}
}
}
Jak widać Czyni absolutnie nic. Kompilacja tego programu plików na Java 1.6 i 1.7 z następującym błędem:
/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
Klasy C i B są semantycznie identyczne, jednak klasa B nie rozpoznaje metody foo jako wdrożenie # foo. Aby uczynić ten kod zgodny trzeba zaimplementować metoda A # foo w klasie B z następującym podpisem:
public void foo(Object obj)
Moje pytanie brzmi, dlaczego mój program nie kompiluje? Typy ogólne Q i T są całkowicie niezależne, więc dlaczego mogę zaimplementować funkcję ogólną A # foo tylko wtedy, gdy jawnie określę rodzajowy typ Q dla odziedziczonej klasy A?
Dzięki
Jestem w stanie wydać repro ". Co więcej, posiadanie nietypowej metody i ogólnej metody powoduje jednocześnie błąd usuwania tego samego typu. – 4castle
Eclipse sugeruje dodanie: '' '@Override public void foo (Object obj) {}' '' '' 'B''', które faktycznie powoduje jego kompilację. (1.8) –
@ 4castle Twoja edycja spowodowała, że komunikaty o błędach są mylące, ponieważ wspominają o usuniętej nazwie pliku źródłowego. –