泛型--<? extends T> 和 <? super T>
基本介绍
-
<? extends T> 是指 “上界通配符(Upper Bounds Wildcards)”
-
表示类型的上界,表示参数化类型的可能是T或是T的子类;
-
//例子 //表示一个能放水果以及一切是水果派生类的盘子 Plate<? extends Fruit>
-
-
<? super T> 是指 “下界通配符(Lower Bounds Wildcards)”
-
表示类型下界(Java Core中叫超类型限定),表示参数化类型是此类型的超类型(父类型),直至Object;
-
//例子 //一个能放水果以及一切是水果基类的盘子 Plate<? super Fruit>
-
使用
-
上界<? extends T>不能往里存,只能往外取
-
set()方法失效,get()方法还有效
Plate<? extends Fruit> fruitPlate = new Plate<Apple>(new Apple()); //不能存入任何元素 fruitPlate.set(new Apple()); //Error 编译错误 fruitPlate.set(new Fruit()); //Error 编译错误 //读取出来的东西只能放在Fruit或它的基类里 Fruit newFruit1=fruitPlate.get(); Object newFruit2 = fruitPlate.get(); Apple newFruit3 = fruitPlate.get(); //Error
-
-
下界<? super T>不影响往里存,但往外取只能放在Object对象里
-
get( )方法部分失效,只能存放到Object对象里;set( )方法正常。
Plate<? super Fruit> fruitPlate = new Plate<Fruit>(new Fruit()); //存入元素正常 fruitPlate.set(new Apple()); fruitPlate.set(new Fruit()); //读取出来的东西只能存放在Object类里 Object newFruit1 = fruitPlate.get(); Fruit newFruit2 = fruitPlate.get(); //Error Apple newFruit3 = fruitPlate.get(); //Error
-
PECS原则
- PECS(Producer Extends Consumer Super)原则:
- 频繁往外读取内容的,适合用上界Extends。
- 经常往里插入的,适合用下界Super。