2009-09-08 23 views
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 { 

    } 
} 

回答

3

如果我理解正確的問題,it's a bug in Java。錯誤狀態表示修復程序已交付,但至少在Java 6中沒有。

+1

我相信bug數據庫說修復程序在build 31中的JDK 7 beta版中。 – 2009-09-08 14:10:58

+0

我認爲你的錯誤提及與接口有關。 @Matt R的示例編譯中的接口。 – akf 2009-09-08 14:35:02

+0

謝謝,是的,只是在JDK 7快照中嘗試了這一點,它已被修復。當然,在bug評估中提出的解決方案也涵蓋了這個例子,「應該修改javac,以便如果給定的超類型對(Sj,Sk)確實包含一對不兼容的成員(m1,m2),則站點符號應該是檢查符號m3是否覆蓋m1和m2。「 – 2009-09-08 15:13:50

相關問題