在Java中,如果返回类型分别是基元及其包装类,是否可以重写方法?

在使用Java中重写和重写方法的想法时,我注意到这些方法的返回类型有一些灵活性。

这里有一点理论:“派生类中重写方法的返回类型可以是相同的,或者是基类中重写方法的返回类型的子类。这种重写方法的返回类型是已知的作为协变回归类型。“

下面的例子假设B扩展A.

Method in A: public Object some_method() {....} Method in B: public Integer some_method() {....} 

因此,我们看到B中的some_method()会覆盖A中的some_method(),因为Integer是Object的子类。

我想知道是否存在以下灵活性以及以下是否因为自动装箱拆箱而正确工作:

 Method in A: public Integer some_method() {....} Method in B: public int some_method() {....} 

要么

 Method in A: public int some_method() {....} Method in B: public Integer some_method() {....} 

您只能返回父类型返回类型的相同类型或子类及其称为Co-Variant返回类型。

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

也许你会把这个概念与重载相混淆。

重载描述了使用相同名称但不同参数的方法; 在规范示例中,重载方法甚至可以返回不同的类型(尽管不鼓励这样做,因为它使代码的可读性降低)。

那说……这是合法的:

 public int foo() { return 1; } public Integer foo(int multiplicand) { return 10 * multiplicand; } 

…因为你没有触及同样的方法。

在inheritance方案中,根据语言规范 ,类似的代码是非法的:

其中一个inheritance的方法必须是每个其他inheritance方法的return-type-substitutable; 否则,发生编译时错误。

 class Primary { public int foo() { return 1; } } // no, this does not compile! class Secondary extends Primary { @Override public Integer foo() { return 1; } } 

因此,如果父类型是Object (因为Integer 是一个由于inheritance Object ),上述方法将起作用,但它根本不适用于基元,因为它们不是对象。

自动装箱很好,因为当我们只关心原语时,它会处理一些必须处理对象的麻烦,但它并不是万灵药。 它们仍然是Object的核心,它们仍然可以指向null ,而原始对象则不能。

这种灵活性不存在,因为“int”是原始数据类型,“Integer”是int数据类型的类/包装。 并且“int”不是“Integer”的子类,而“Integer”是“Object”类的子类

第一个例子:

 Method in A: public Object some_method() {....} Method in B: public Integer some_method() {....} 

这种类型的重写可能,但rest两个例子覆盖不可能。