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不是抽象的,也没有覆盖 test.TestGenericsInheritance.A中的抽象方法foo(java.lang.Object) /D:/Projects/.../test/TestGenericsInheritance.java:[27,25] 名称冲突: test.TestGenericsInheritance.B中的foo(T)和test.TestGenericsInheritance.A中的foo(T)具有相同的擦除,但都没有覆盖另一个 /D:/Projects/.../test/TestGenericsInheritance.java:[26,9] 方法未覆盖或实现超类型的方法
类C和B在语义上是相同的,但是类B不认为方法foo是A#foo的实现。为了使这段代码合规,我必须在类B中实现A#foo方法,并使用以下签名:
public void foo(Object obj)
我的问题是,为什么我的程序无法编译?泛型类型Q和T是完全独立的,那么为什么我只有在为继承类A明确指定泛型类型Q时,才能实现泛型函数A#foo呢?
谢谢
@Override public void foo(Object obj) {}
,这确实可以使它编译通过。(1.8) - Jorn Vernee