目錄
- 概念簡單理解
- 代碼樣例解讀
- 關于List<? super T>
- add方面
- 回傳值方面
- 關于List<? extendsT>
- add方面
- 回傳值方面
- 總結
概念簡單理解
-
List<? extends T>表示該集合中存在的都是型別T的子類,包括T自己
-
List<? super T>表示該集合中存的都是型別T的父類,包括T自己
代碼樣例解讀
父子類代碼:
/**
* 生物
*/
static class Biological{
}
/**
* 動物
*/
static class Animal extends Biological{
}
/**
* 植物
*/
static class Plant extends Biological{
}
static class Dog extends Animal{
}
static class Cat extends Animal{
}
static class Flower extends Plant{
}
static class Tree extends Plant{
}
關系圖:

測驗代碼:
public static void main(String[] args) {
List<? super Animal> listA = new ArrayList<>();
List<? extends Plant> listB = new ArrayList<>();
//listA.add(new Biological());
listA.add(new Animal());
listA.add(new Dog());
//listA.add(new Flower());
Object object = listA.get(0);
//listB.add(new Plant());
//listB.add(new Flower());
listB.add(null);
Plant plant = listB.get(0);
}
關于List<? super T>
add方面
List<? super Animal> listA = new ArrayList<>();
listA.add(new Biological());
執行上面這行代碼是不允許的,因為listA的集合型別是Animal或者更高的父類,想一下如果代表的型別是Animal,那怎么允許add它的父類Biological呢?當然不允許了,
listA.add(new Animal());
listA.add(new Dog());
執行上面這兩句就是可以正常執行的,因為無論是Animal還是Animal的子類Dog,都是可以存到集合型別是Animal或者更高的父類的集合中的,有點拗口,不過就是這個意思,
listA.add(new Flower());
添加Flower當然是不可以的,因為它不是Animal的子類,
回傳值方面
Object object = listA.get(0);
因為listA的集合型別是Animal或者更高的父類,所以不清楚到底會是哪個類,但是我們都應該清楚所有類的父類都是Object,所以回傳值是Object型別的,
關于List<? extendsT>
add方面
List<? extends Plant> listB = new ArrayList<>();
listB.add(new Plant());
執行上面的代碼是不允許的,因為listB的集合型別是Plant或Plant的子類,想一下如果代表的型別是Plant的子類Tree,那么怎么可能可以add它的父類Plant呢?所以跟上面的那個理解差不多,就是反過來理解,看圖可以更加清晰,
listB.add(new Flower());
這個同理,如何代表的型別是Flower的子類Rose(玫瑰花),這樣當然不可以add它的父類Flower了,
listB.add(null);
特殊情況就是這個,可以add null,但是也沒意義啊,
回傳值方面
Plant plant = listB.get(0);
因為listB的集合型別是Plant或者它的子類,所以不清楚到底會是哪個類,但是我們可以知道,最高的型別就是Plant了,所以回傳值就是Plant型別的,
總結
-
List<? super T>表示該集合中存的都是型別T的父類,包括T自己
- add:不能add任何物件(特例:可以添加null)
- get:get回傳的物件型別為T
-
List<? extends T>表示該集合中存在的都是型別T的子類,包括T自己
-
add:只能添加T及T的子類
-
get:get回傳的物件型別為Object
-
著作權宣告:
原創博主:牛哄哄的柯南
博主原文鏈接:https://keafmd.blog.csdn.net/
看完如果對你有幫助,感謝點擊下面的一鍵三連支持!
[哈哈][抱拳]


加油!
共同努力!
Keafmd
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/292021.html
標籤:java
