? 通配符类型
- 表示类型的上界,表示参数化类型的可能是T 或是 T的子类
- 表示类型下界(Java Core中叫超类型限定),表示参数化类型是此类型的超类型(父类型),直至Object
上界
不能往里存,只能往外取
比如,我们现在定义:List
首先你很容易误解它为继承于T的所有类的集合,你可能认为,你定义的这个List可以用来put任何T的子类,那么我们看下面的代码
import java.util.LinkedList; import java.util.List; public class test { public static void main(String[] args) { List<? extends Father> list = new LinkedList<>(); list.add(new Son()); } } class Human{ } class Father extends Human{ } class Son extends Father{ } class LeiFeng extends Father { }
list.add(new Son());这行会报错
The method put(Son) is undefined for the type List
List
表示 “具有任何从Son继承类型的列表”,编译器无法确定List所持有的类型,所以无法安全的向其中添加对象。可以添加null,因为null 可以表示任何类型。所以List 的add 方法不能添加任何有意义的元素,但是可以接受现有的子类型List 赋值。你也许试图这样做
List<? extends Father> list = new LinkedList<Son>(); list.add(new Son());
- 1
- 2
即使你指明了为Son类型,也不能用add方法添加一个Son对象。
list中为什么不能加入Father类和Father类的子类呢,我们来分析下。
List
表示上限是Father,下面这样的赋值都是合法的
List<? extends Father> list1 = new ArrayList<Father>(); List<? extends Father> list2 = new ArrayList<Son>(); List<? extends Father> list3 = new ArrayList<LeiFeng>();
- 1
- 2
- 3
如果List
支持add方法的话:
- list1可以add Father和所有Father的子类;
- list2可以add Son和所有Son的子类;
- list3可以add LeiFeng和所有LeiFeng的子类。