什么是协变返回类型?

2022-08-31 09:05:34

Java 中的协变返回类型是什么?在一般的面向对象编程中?


答案 1

协变返回意味着当重写方法时,重写方法的返回类型允许为重写方法的返回类型的子类型。

为了通过示例来澄清这一点,一个常见情况是 - 它被声明为返回一种类型。您可以在自己的类中重写它,如下所示:Object.clone()Object

public class MyFoo
{

   ...

   // Note covariant return here, method does not just return Object
   public MyFoo clone()
   {
       // Implementation
   }
}

这里的好处是,任何对MyFoo对象进行显式引用的方法都将能够调用并知道(无需强制转换)返回值是 的实例。如果没有协变返回类型,MyFoo中被覆盖的方法必须声明为返回 - 因此调用代码必须显式下放方法调用的结果(甚至认为双方都“知道”它只能是MyFoo的一个实例)。clone()MyFooObject

请注意,没有什么特别之处,任何被覆盖的方法都可以有一个协变返回 - 我在这里用它作为一个例子,因为它是一个标准方法,这通常是有用的。clone()


答案 2

这是另一个简单的例子:

Animal

public class Animal {

    protected Food seekFood() {

        return new Food();
    }
}

Dog

public class Dog extends Animal {

    @Override
    protected Food seekFood() {

        return new DogFood();
    }
}

可以将 的 返回类型修改为 - 的子类,如下所示:DogseekFood()DogFoodFood

@Override
protected DogFood seekFood() {

    return new DogFood();
}

这完全是一个合法的覆盖,方法的返回类型称为协变返回类型DogseekFood()