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
*/