4

以下编译没有任何问题

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兼容,那么为什么编译器会抱怨?自动装箱在这里不适用吗?

4

3 回答 3

5

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

编译允许您在原语和包装器之间自动装箱和拆箱,但这不会使一个成为另一个的子类。原语不是类,不能按照您建议的方式使用。

我只想让 getStatus() 返回Boolean或让父母返回boolean

从理论上讲,可以扩展自动装箱以允许您提出建议,但我认为它没有多大用处。

理论上你也可以这样写

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

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

由于编译器支持隐式向上转换。但是,我再次怀疑这也没有太大用处。

于 2013-07-09T12:43:56.130 回答
0

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

public Boolean getStatus(){ // Compile error: return type is incompatible
     return Boolean.TRUE;
}

返回后可以拆箱:

if(getStatus()) doSomething();
于 2013-07-09T12:44:39.007 回答
0

众所周知,我们只能返回父类返回类型的子类。这里的布尔是包装类,而布尔是原始数据类型。简而言之,两者作为包装类和原始数据类型不同。所以它给出了不兼容的错误。

于 2013-07-09T12:48:46.417 回答