什么是协变回报类型?

Pop*_*ops 96 java oop covariance

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

And*_*yle 133

协变返回意味着当一个覆盖一个方法时,覆盖方法的返回类型被允许是被覆盖方法的返回类型的子类型.

为了用一个例子来澄清这一点,一个常见的例子是Object.clone()- 声明返回一种类型Object.你可以在你自己的类中覆盖它,如下所示:

public class MyFoo
{

   ...

   // Note covariant return here, method does not just return Object
   public MyFoo clone()
   {
       // Implementation
   }
}
Run Code Online (Sandbox Code Playgroud)

这里的好处是任何持有对MyFoo对象的显式引用的方法都能够调用clone()并知道(不强制转换)返回值是其实例MyFoo.如果没有协变返回类型,MyFoo中的重写方法必须声明为返回Object- 因此调用代码必须显式地向下转换方法调用的结果(甚至认为双方"知道"它只能是MyFoo的一个实例).

请注意,没有什么特别的,clone()并且任何重写的方法都可以有一个协变返回 - 我在这里使用它作为一个例子,因为它是一个标准的方法,这通常是有用的.

  • 这是广义上的协变类型,而不仅仅是在这里询问的协变**返回**类型.它是相同的基本原则 - 你可以把`clone()`的顶级定义想象成`Method <Void,Object>`,并询问是否更具体的`Method <Void,MyFoo>`可分配给该父类型.当且仅当Java方法在其返回类型中是协变的时,它才是. (2认同)

Moh*_*ANE 35

这是另一个简单的例子:

Animal

public class Animal {

    protected Food seekFood() {

        return new Food();
    }
}
Run Code Online (Sandbox Code Playgroud)

Dog

public class Dog extends Animal {

    @Override
    protected Food seekFood() {

        return new DogFood();
    }
}
Run Code Online (Sandbox Code Playgroud)

这是可能的修改的返回类型DogseekFood()方法DogFood-的一个子类Food,如下所示:

@Override
protected DogFood seekFood() {

    return new DogFood();
}
Run Code Online (Sandbox Code Playgroud)

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


小智 7

从JDK 1.5的发布版开始,Java中引入了协变类型.我将用一个简单的例子向你解释:当我们覆盖一个函数时,允许函数对它的行为进行更改,这是你在大多数书中读到的内容,但是他们{作者}错过了什么是我们也可以改变返回类型.检查下面的链接以便澄清我们可以更改返回类型,只要它可以分配给方法的基本版本的返回类型.

所以返回派生类型的这个特性叫做COV​​ARIANT ......

被覆盖的方法可以在返回类型上有所不同吗?


小智 6

covariant返回类型只是表示返回自己的Class引用或其子类引用.

class Parent {
 //it contain data member and data method
}

class Child extends Parent { 
//it contain data member and data method
 //covariant return
  public Parent methodName() {
     return new Parent();
          or 
     return Child();
  }

}
Run Code Online (Sandbox Code Playgroud)

  • 它还包括“Parent.foo()”返回不相关的类型“A”和“Child.foo()”返回从“A”派生的类型“B”的情况。 (2认同)