在 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() {....}

只能返回父级返回类型及其称为协变量返回类型的相同类型或子类。

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

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

也许你会把这个概念与重载混为一谈。

重载

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

可是。。。这是合法的:

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

。因为你没有碰到相同的方法。

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

其中一个继承的方法必须可替换所有其他继承方法;否则,将发生编译时错误。

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

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

自动装箱很好,因为它解决了当我们只关心原始对象时不得不处理对象的一些烦恼,但它不是万能的。 他们仍然是Object的,他们仍然可以指向null,而原始人根本不能。

对于第一个示例:

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

这种类型的覆盖是可能的,但休息两个示例的覆盖是不可能的。

最新更新