java泛型中的關鍵字
- ? 表示通配符類型
- <? extends T> 既然是extends,就是表示泛型參數類型的上界,說明參數的類型應該是T或者T的子類。
- <? super T> 既然是super,表示的則是類型的下界,說明參數的類型應該是T類型的父類,一直到object。
實例代碼看具體的區別
public class FanXing {
static class Fruit {
}
static class Apple extends Fruit {
}
static class Orange extends Apple {
}
public static void main(String... args) throws Exception {
List<? extends Fruit> list = new ArrayList<Orange>();
//無法安全添加不確定類型的元素
list.add(new Orange());
list.add(null);
Fruit fruit = list.get(0);
Orange orange = (Orange) list.get(0);
List<? super Fruit> list1 = new ArrayList<>();
list1.add(new Orange());
//無法確定具體的返回類型
Fruit fruit1 = list1.get(0);
Orange orange1 = (Orange) list1.get(0);
}
}
來看一下代碼編譯器中兩種不同的限定報錯
extends限定
List<? extends Fruit> 表示是一個Fruit類弄的或者Fruit子類的泛型
編譯器無法確定List所持有的類型,所以無法安全的向其中添加對象。
但是可以添加null,因為null可以表示任何類型。
由於list里面的類型是從Fruit中繼承過來的,所以可以安全取出Fruit類型
super限定
List<? super Fruit> 表示是一個Fruit類弄的或者Fruit父類的泛型
列表的類型至少是一個Fruit類型,因此可以安全的向其中添加Fruit及其子類型
由於list里面的類型是從Fruit的父類,編譯器無法確定返回的類型,所以直接取值時會報錯
小結
extends 可用於的返回類型限定,不能用於參數類型限定。
super 可用於參數類型限定,不能用於返回類型限定。
希望只取出,不插入,就使用? extends
希望只插入,不取出,就使用? super
希望,即能插入,又能取出,就不要用通配符?