以下编译没有任何问题
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
(文字)
我的问题是,如果Boolean
和boolean
兼容,那么编译器为什么抱怨?自动装箱不适用于此吗?
答案 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)
我们知道,我们只能返回父类返回类型的子类。这里布尔是包装类,而布尔是原始数据类型。简而言之,两者都是不同的包装类和原语。因此它给出了不兼容的错误