泛型通配符规则

Posted chenloveslife

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了泛型通配符规则相关的知识,希望对你有一定的参考价值。

1. 为什么使用通配符

  通配符的使用可以对泛型参数做出某些限制,使代码更安全。我们知道数组是可以协变的,当涉及到泛型时,尽管B是A的子类型,但是 ArrayList<B> 不是 ArrayList<A> 的子类型,二者没有关系,泛型不支持协变,这个时候就要需要通配符来解决这个问题。

2. 使用规则

  (1) “?”不能添加元素

      当“?”为类型变量的,不能往集合中添加元素,甚至不能用Object调用,Pair<?>和Pair本质的不同在于:可以用任意Object对象调用原始Pair类的setObject方法。

  (2)  "?" extends T不能添加元素

      因为编译器只需要知道某个Employee的子类型,但是不知道是什么类型,所以拒绝任何特定类型。但是可以返回子类型限定的对象。

1         Pair<Manager> managerPair = new Pair<>(ceo, cfo);
2         Pair<? extends Employee> employeePair = managerPair;
3         //employeePair.setFirst(coo); //不可调用setFirst方法,因为编译器只需要知道某个Employee的子类型,但是不知道是什么类型,所以拒绝任何特定类型
4         Employee e = employeePair.getFirst();  //合法

 

  (3)  “? super T”能添加元素,也能返回对象类型,但只能赋值给Object类

1         Pair<Employee> employeePair = new Pair<>(idiot, idiot1);
2         Pair<? super Manager> managerPair = employeePair;
3         Object obj = managerPair.getFirst();  //不能保证返回对象的类型,所以只能赋值给Object类
4         managerPair.setFirst(ceo);  //可以为方法提供参数,但只能提供超类型限定的对象

 

3. 总结

  带有超类型限定的通配符可以向泛型对象写入,带有子类型限定的通配符可以从泛型对象获取

  

以上是关于泛型通配符规则的主要内容,如果未能解决你的问题,请参考以下文章

Java泛型使用的简单介绍

Java 泛型方法泛型类通配符通配符上下限

Java 泛型泛型用法 ( 泛型编译期擦除 | 上界通配符 <? extends T> | 下界通配符 <? super T> )

自定义泛型_无多态_通配符无泛型数组_jdk7泛型使用

Java 泛型概述与应用

Java 泛型泛型用法 ( 泛型类用法 | 泛型方法用法 | 泛型通配符 ? | 泛型安全检查 )