覆盖和返回类型兼容性

时间:2013-07-09 12:40:48

标签: java autoboxing method-overriding

以下编译没有任何问题

boolean flag = true;
Boolean flagObj = flag; 

现在对以下场景进行成像

interface ITest{

     Boolean getStatus();

}

 class TestImpl implements ITest{

     public boolean getStatus(){ // Compile error: return type is incompatible
         return true;
     }
 }

我的问题是关于上述行的编译错误。我的界面提到返回类型为Boolean,但实现的方法返回boolean文字

我的问题是,如果Booleanboolean兼容,那么编译器为什么抱怨?自动装箱不适用于此吗?

3 个答案:

答案 0 :(得分:5)

您只能返回父级返回类型的子类。

编译允许您在基元和包装器之间自动装箱和取消装箱,但这不会使另一个成为另一个子类。基元不是类,不能按照你的建议使用。

我只是让getStatus()返回Boolean或让父回复boolean

从理论上讲,自动拳击可以扩展到允许你的建议,但我觉得它并没有多大用处。

理论上你也可以写这个

class A {
    int method() { ... }
}

class B extends A {
    short method() { .... }
}

由于编译器支持隐式向上转换。然而,我再次怀疑这种情况没有多大用处。

答案 1 :(得分:0)

这些方法在原型和实现上有不同的签名。原语(不是类)不能子类化原型的Boolean。即使使用自动装箱,实施也违反了通用原型。在返回后执行自动拆箱,所以如果像这样实现了getStatus:

public Boolean getStatus(){ // Compile error: return type is incompatible
     return Boolean.TRUE;
}
返回后可以取消装箱

if(getStatus()) doSomething();

答案 2 :(得分:0)

我们知道,我们只能返回父类返回类型的子类。这里布尔是包装类,而布尔是原始数据类型。简而言之,两者都是不同的包装类和原语。因此它给出了不兼容的错误