我有一对 ClassA 和 ClassB 如下所示。
案例一:
class ClassA<T extends Number>{
void method(T t){}
}
class ClassB extends ClassA<Integer>{
@Override
void method(Integer i){}
}
案例2:
class ClassA{
void method(Number t){}
}
class ClassB extends ClassA{
@Override
void method(Integer i){}
}
我有两个问题。
[q1]
我这样说对吗,case2 是 case1 的运行时表示(类型删除后)?
[q2] 如果我对 [q1] 是正确的,那么为什么 case1 被接受为有效的覆盖? (我知道为什么 case2 不是有效的覆盖,因为参数不一样。)
请有人对此有所了解。 提前致谢。
最佳答案
[q1] 的答案是否定的。
编译器将在 ClassB
中生成一个 bridge 方法,该方法实际上将覆盖 method(Number)
。
class ClassB extends ClassA{
// bridge method
void method(Number i){
method((Integer)i);
}
void method(Integer i){}
}
您将在 java doc 中获得完整的答案关于类型删除。
关于Java 泛型 - 方法覆盖,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29296303/