首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >什么是协变返回类型?

什么是协变返回类型?
EN

Stack Overflow用户
提问于 2009-12-11 01:23:13
回答 9查看 79.8K关注 0票数 113

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

EN

回答 9

Stack Overflow用户

回答已采纳

发布于 2009-12-11 01:24:13

协变返回,意味着当重写一个方法时,重写方法的返回类型可以是被重写方法的返回类型的子类型。

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

代码语言:javascript
复制
public class MyFoo
{

   ...

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

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

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

票数 150
EN

Stack Overflow用户

发布于 2015-09-15 03:36:34

下面是另一个简单的例子:

Animal

代码语言:javascript
复制
public class Animal {

    protected Food seekFood() {

        return new Food();
    }
}

Dog

代码语言:javascript
复制
public class Dog extends Animal {

    @Override
    protected Food seekFood() {

        return new DogFood();
    }
}

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

代码语言:javascript
复制
@Override
protected DogFood seekFood() {

    return new DogFood();
}

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

票数 45
EN

Stack Overflow用户

发布于 2014-03-19 15:46:33

从JDK 1.5版本开始,Java中引入了协变类型。我会用一个简单的例子向你解释:当我们重写一个函数时,函数被允许改变它的行为,这就是你在大多数书中读到的,但是他们(作者)遗漏的是我们也可以改变返回类型。检查下面的链接澄清我们可以更改返回类型,只要它可以分配给方法的基本版本的返回类型。

因此,这种返回派生类型的功能称为协变...

Can overridden methods differ in return type?

票数 10
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1882584

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档