java-协变返回类型
2021-01-13 21:14
标签:设置 new span import 必须 like stream 不同 编译错误 在JDK 5.0之前, 通过更改返回类型来覆盖方法是不可能的。当我们重写父类方法时,子类中的重写方法的名称,参数类型和返回类型必须与父类方法的完全相同。 从Java 5.0开始,对于子类中的重写方法可以有不同的返回类型,但是子类的返回类型应该是父类的返回类型的子类型。覆盖方法就返回类型而言变为变体 也就是:导出类(子类)覆盖(即重写)基类(父类)方法时,返回的类型可以是基类方法返回类型的子类。 简单内容; java-协变返回类型 标签:设置 new span import 必须 like stream 不同 编译错误 原文地址:https://www.cnblogs.com/java-quan/p/12945405.htmlpublic 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
*/