java协变逆变,PECS

Posted 庚武讲堂

tags:

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

    public static void main(String[] args) {
        // Object <- Fruit <- Apple <- RedApple
        System.out.println(Apple.class.isAssignableFrom(Fruit.class));
        System.out.println(Fruit.class.isAssignableFrom(Fruit.class));
        System.out.println(Fruit.class.isAssignableFrom(Apple.class));  // apple 是 Fruit子类

        // 协变
        List<Apple> apples = new ArrayList<Apple>();
        List<? extends Fruit> listfruits = apples;
//        listfruits.add(new Apple());
//        listfruits.add(new RedApple());
//        listfruits.add(new Fruit());  // ERROR: 不能够往一个使用了? extends的数据结构里写入任何的值。
        Fruit f = listfruits.get(0);

        // 逆变
        List<Fruit> fruits = new ArrayList<Fruit>();
        List<? super Apple> list2 = fruits;
//        list2.add(new Fruit());   //ERROR
        list2.add(new Apple());
        list2.add(new RedApple());
//        Fruit f = list2.get(0);   //ERROR

        /*
        存取原则和PECS法则
        总结 ? extends 和 the ? super 通配符的特征,我们可以得出以下结论:

        如果你想从一个数据类型里获取数据,使用 ? extends 通配符
        如果你想把对象写入一个数据结构里,使用 ? super 通配符
        如果你既想存,又想取,那就别用通配符。
        这就是Maurice Naftalin在他的《Java Generics and Collections》这本书中所说的存取原则,
        以及Joshua Bloch在他的《Effective Java》这本书中所说的PECS法则。
        Bloch提醒说,这PECS是指”Producer Extends, Consumer Super”,这个更容易记忆和运用。
        * */
    }

  http://www.cnblogs.com/softidea/p/4106659.html

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

[JAVA冷知识]什么是逆变(contravariant)与协变(covariant)?数组是否支持协变&逆变?泛型呢?

[JAVA冷知识]什么是逆变(contravariant)与协变(covariant)?数组是否支持协变&逆变?泛型呢?

Java泛型中的协变和逆变

Java进阶知识点2:看不懂的代码 - 协变与逆变

java逆变与协变(待完善)

Java 逆变与协变