java-协变返回类型

Posted 小丑quan

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java-协变返回类型相关的知识,希望对你有一定的参考价值。

在JDK 5.0之前, 通过更改返回类型来覆盖方法是不可能的。当我们重写父类方法时,子类中的重写方法的名称,参数类型和返回类型必须与父类方法的完全相同。

从Java 5.0开始,对于子类中的重写方法可以有不同的返回类型,但是子类的返回类型应该是父类的返回类型子类型。覆盖方法就返回类型而言变为变体

也就是:导出类(子类)覆盖(即重写)基类(父类)方法时,返回的类型可以是基类方法返回类型的子类。

 

public class Ay {

    public static void main(String[] args) {
        Person person = new Boy();
        Flower flower = person.buy();
        flower.like();
        //! flower.love();  编译错误,因为这里的flower是Flower类,所以这里向上进行了转型,因为本来是RoseFlower

//因为是协变返回类型,所以可以向下转型 RoseFlower roseFlower = (RoseFlower) person.buy(); //可以调用like方法 roseFlower.like(); //可以调用love方法 roseFlower.love(); } } class Person{ public Flower buy(){ System.out.println("Flower..."); return new Flower(); } } /** * 男孩 */ class Boy extends Person{ /** * 这里覆盖Person类的buy * @return */ @Override public RoseFlower buy(){ System.out.println("RoseFlower..."); //注意这里,这里就是协变返回类型 //导出类**(子类)覆盖(即重写)**基类**(父类)方法时, // 返回的类型可以是基类方法返回类型的子类 return new RoseFlower(); } } class Flower{ /** * 让普通人喜欢 */ public void like(){ System.out.println("like"); } } class RoseFlower extends Flower{ /** * 让女孩喜欢 */ public void love(){ System.out.println("love...."); } }

 

简单内容;

import java.io.ByteArrayInputStream;
import java.io.InputStream;

class Base
{
    //子类Derive将重写此方法,将返回类型设置为InputStream的子类
   public InputStream getInput()
   {
      return System.in;
   }
}
public  class Derive extends Base
{
    
    @Override
    public ByteArrayInputStream getInput()
    {
        
        return new ByteArrayInputStream(new byte[1024]);
    }
    public static void main(String[] args)
    {
        Derive d=new Derive();
        System.out.println(d.getInput().getClass());
    }
}
/*程序输出:
class java.io.ByteArrayInputStream
*/

 

以上是关于java-协变返回类型的主要内容,如果未能解决你的问题,请参考以下文章

java遗珠之协变返回类型

协变返回类型、常量和不完整类

协变逆变与不变:数组泛型与返回类型

Java泛型的协变

Java协变式覆盖(Override)和泛型重载(Overload)

C++ 克隆习语中协变返回类型的用处?