Java泛型可能有的几种形式:
- <T>
- <?>
- <? extends T>
- <? super T>
1. <T>
最简单就是指定一种具体的类型,无论是set还是get获取的都是固定的T类型。
2. <?>
?表示所有类型,但是不知道到底是哪种类型。和T
的方式有区别,T
是有确定的类型,而?
则可能是所有类型。
3. <? extends T>
例如: List<? extends Fruit> list = new ArrayList<Apple>();
其中T 表示 Fruit,而Apple是Fruit的子类,所以<? extends Fruit
>是<Apple>的父类,那么new ArrayList<Apple>()的引用是可以赋值给 List<? extends Fruit>。但是通过list 这个new ArrayList<Apple>()
对象进行操作时,list的类型是? extends Fruit
,那么用户可能添加Banana、Orange,他们和Apple是兄弟关系,而ArrayList<Apple>()
实例是不可以添加Banana的。所以编译器规定不运行执行add操作。只能get,因为当get是能保证至少都是Fruit类型。
4. <? super T>
例如: List<? super Fruit> list = new ArrayList<Food>();
其中 T 是 Fruit,Fruit是Food的子类。那么<? super Fruit> 是<Food>的父类。当通过List<? super Fruit> list
进行增加操作时,只要是Fruit的子类,都是可以添加到 ArrayList<Food>的实例当中的。但是当通过list进行获取操作时,Fruit可能有多个父类,那么get获取到的是哪个父类呢?不知道。就懵逼了。倒是可以获取到Object这个通用的父类。
理解:
- 可以将
? extends T
、? super T
看成一种具体的类型,只是写法比较怪异。 - 重点是 视角。当通过
List<? super Fruit> list
参数操作时,我们要想到他实例化对象 后面的可能性。
网友评论