public class Base {
为什么在Derived类中定义重写方法f1()和f3()不会产生编译错误,比如Derived类中的重写f2()方法的定义(它给出编译错误“返回类型与Base.f2()不兼容”)?
JLS中的子签名覆盖规则允许覆盖方法(在Derived类中)是非泛型的,而重写方法(在Base类中)是通用的.
未经检查的覆盖规则允许在子类List< String>中创建返回类型.代替List< T>在基类.
但我无法解释下面的行为差异,我不明白为什么fin()和f3()覆盖Derived类中的定义成功编译(在Eclipse,SE8上),忽略了f3()的有界类型参数所施加的限制f1()的有界通配符!
附:我的猜测 – 在Derived编译器中的f1()和f3()中将两个方法视为仅返回“原始”List – 编译器首先进行擦除(此时仅在Derived!中),然后将Derived中的这些擦除方法与未擦除的方法进行比较(到目前为止)Base中的方法.现在未经检查的覆盖规则是正常的(并且不需要检查边界 – 这根本不可能),编译器决定这是正确的覆盖和编译更进一步……在Base.f1()和Base的编译泛型结束时的某处.f3()也擦掉:)))
This SO answer还为这个主题添加了想法.
最佳答案