如果方法具体,为什么允许这种协变覆盖,但如果是抽象的则不允许?

时间:2009-09-08 13:07:03

标签: java

在下面的代码中,不允许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 {

    }
}

1 个答案:

答案 0 :(得分:3)

如果我正确理解了这个问题,it's a bug in Java。错误状态表示已提供修复,但至少在Java 6中没有。