Java 重写和返回类型兼容性

Java 重写和返回类型兼容性,java,autoboxing,overriding,Java,Autoboxing,Overriding,下面的代码编译起来没有任何问题 boolean flag = true; Boolean flagObj = flag; 现在想象一下下面的场景 interface ITest{ Boolean getStatus(); } class TestImpl implements ITest{ public boolean getStatus(){ // Compile error: return type is incompatible retu

下面的代码编译起来没有任何问题

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

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

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

我只需要让getStatus()返回
布尔值
,或者让父级返回
布尔值

理论上,自动装箱可以扩展到允许您的建议,但我不认为它有多大用处

理论上你也可以写这个

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

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

因为编译器支持隐式向上转换。然而,我再次怀疑这也没有多大用处。

这些方法在原型和实现上有不同的签名。原语不是一个类,不能将原型的
布尔
子类化。即使使用自动装箱,实现也违反了通用原型。自动取消装箱是在返回后执行的,因此如果getStatus是这样实现的:

public Boolean getStatus(){ // Compile error: return type is incompatible
     return Boolean.TRUE;
}
返回后,可以将其解除绑定为:

if(getStatus()) doSomething();

正如我们所知,我们只能返回父级返回类型的子类。这里Boolean是包装类,而Boolean是基元数据类型。简言之,两者作为包装类和基元是不同的。因此它给出了不兼容的错误。

不,它们不“兼容”。一个是对象,另一个是基元类型。自动{un,}装箱是一回事,方法原型是另一回事;)是的,所以答案是语言是这样定义的,这不是编译器中的错误。同样,您不能使用
int
覆盖
long
。我的意思是,能够实现一个
Void
返回方法和一个
Void
返回方法是很好的,但是你不能。哎哟,永远不要创建一个新的布尔值,甚至不要建议它。只有两个可能的值,它们在添加自动装箱之前就已被缓存。顺便说一句,我喜欢Interrobang。@PeterLawrey这主要是为了给未来的读者强调说明效果,但我删除了它。你可以写
Boolean.valueOf(true)
Boolean.true
,你会惊讶于有多少商业产品称之为
新布尔
这是我最讨厌的东西。谢谢Peter。我无意中发现了这个问题,这就是我在编译器标记错误之前的想法(自动装箱可以扩展)。@Santosh Java往往是一种“功能差”的语言,只添加您真正需要的东西(有时添加任何东西都非常慢),大多数功能都很好地理解,边缘情况较少(即使如此,仍然有大量的gotcha)