java 协变类型思考

含义:

1、协变类型返回也是覆盖方法的一种,jdk5开始支持的一种:子类覆盖方法返回可以是子类返回的子类,这个比较拗口

2、Java5.0放宽了这一限制,只要子类方法与超类方法具有相同的方法签名,或者子类方法的返回值是超类方法的子类型,就可以覆盖。

代码实例:(https://blog.csdn.net/huangwenyi1010/article/details/53454542

public class Ay {

    public static void main(String[] args) {
        Person person = new Boy();
        Flower flower = person.buy();
        flower.like();
        //! flower.love();  编译错误
        
        //因为是协变返回类型,所以可以向下转型
        //这里RoseFlower是Flower的子类,
        RoseFlower roseFlower  = (RoseFlower) person.buy();
        //可以调用like方法
        roseFlower.like();
        //可以调用love方法,与  “! flower.love();编译错误”  做对比
        roseFlower.love();
    }
}
class Person{
    public Flower buy(){
        System.out.println("Flower...in Person");
        return new Flower();
    }
}
/**
 * 男孩
 */
class Boy extends Person{

    /**
     * 这里覆盖Person类的buy
     * @return
     */
    @Override
    public RoseFlower buy(){
        System.out.println("RoseFlower...in Boy");
        //注意这里,这里就是协变返回类型
        //导出类**(子类)覆盖(即重写)**基类**(父类)方法时,
        //返回的类型可以是基类方法返回类型的子类
        //这里	Boy    -->Person  
        //	RoseFlower -->Flower
        //所以子类型的返回类型也可以是子类型的意思,因此“协变了”
        return new RoseFlower();
    }
}
class Flower{
    /**
     * 让普通人喜欢
     */
    public void like(){
        System.out.println("like in Flower");
    }
}
class RoseFlower extends Flower{
    /**
     * 让女孩喜欢
     */
    public void love(){
        System.out.println("love..in RoseFlower");
    }
}

猜你喜欢

转载自blog.csdn.net/leokingszx/article/details/86064525
今日推荐