3
在下面的代碼中,MoreSpecificHasInfo.getInfo()
不允許被Sun Java 5/6編譯器覆蓋,稱爲「types IHasSpecialInfo and AbstractHasInfo are incompatible; both define getInfo(), but with unrelated return types
」,儘管它在Eclipse 3.4.2下編譯時沒有錯誤。另外,如果我用註釋的具體版本替換getInfo()
的抽象實現,它在任何地方編譯都很好。爲什麼如果該方法是具體的,這個協變覆蓋是允許的,但是如果抽象的話,這不是允許的?
我想知道Sun或Eclipse編譯器的哪個(如果有的話)與Java Language Spec一致,並且如果Sun的編譯器是正確的,爲什麼不允許這樣做?
interface IInfo {
}
interface ISpecialInfo extends IInfo {
}
interface IHasInfo {
IInfo getInfo();
}
interface IHasSpecialInfo extends IHasInfo {
ISpecialInfo getInfo();
}
abstract class AbstractHasInfo implements IHasInfo {
public abstract AbstractInfo getInfo();
abstract class AbstractInfo implements IInfo {
}
}
abstract class MoreSpecificHasInfo extends AbstractHasInfo implements IHasSpecialInfo {
@Override
abstract public MoreSpecificInfo getInfo();
// @Override
// public MoreSpecificInfo getInfo() {
// return null;
// }
abstract class MoreSpecificInfo extends AbstractHasInfo.AbstractInfo implements ISpecialInfo {
}
}
我相信bug數據庫說修復程序在build 31中的JDK 7 beta版中。 – 2009-09-08 14:10:58
我認爲你的錯誤提及與接口有關。 @Matt R的示例編譯中的接口。 – akf 2009-09-08 14:35:02
謝謝,是的,只是在JDK 7快照中嘗試了這一點,它已被修復。當然,在bug評估中提出的解決方案也涵蓋了這個例子,「應該修改javac,以便如果給定的超類型對(Sj,Sk)確實包含一對不兼容的成員(m1,m2),則站點符號應該是檢查符號m3是否覆蓋m1和m2。「 – 2009-09-08 15:13:50