目录

java 泛型

目录

java 泛型

Java在JDK5之后引入泛型,但是Java的泛型是伪泛型,Java虚拟机本身是不支持泛型的。Java的泛型是语法糖。

  • 泛型方法,只有有定义了<T>才是: public <T> void test(T t){
  • 只是方法里面的参数类型使用到了泛型,不是泛型方法,而是普通方法:public void test3(List<?> list){
// 协变
List<? extends Fruit> fruit = new ArrayList<Apple>();
// 逆变
List<? super Apple> fruit = new ArrayList<Fruit>();
// 不变
List<Apple> fruit = new ArrayList<Apple>();
  • extends作为泛型中用于引入协变机制的关键词。相当于知道了上界,但是子子孙孙不知道,到底该存谁呢,为了避开这个问题,干脆都不存。
  • super作为泛型中用于引入逆变机制的关键词。相当于知道了下界,但是祖祖辈辈不知道,多态在此时就能正常运行,父类引用指向子类对象。也就是能加入子孙,而排斥老一辈。

extends是限制数据来源的(生产者),而super是限制数据流入的(消费者)。

producer-extends, consumer-super(PECS)

已知数据下界(super),应该细化存储;已知数据上界(extends),应该粗糙拿取。(其中细化就是指用子类或者本身存,粗糙就是用父类或者本身取)