JAVA 泛型 通配符? extends super限定,實例區分extends super限定的作用用法


java泛型中的關鍵字

  1. ? 表示通配符類型
  2. <? extends T> 既然是extends,就是表示泛型參數類型的上界,說明參數的類型應該是T或者T的子類。
  3. <? 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
希望,即能插入,又能取出,就不要用通配符?


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM