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-协变返回类型的主要内容,如果未能解决你的问题,请参考以下文章