public class Applicatioon {
public static void main(String[] args) {
Plate<? extends Fruit> plate1 = new Plate<>(new Apple());
/**
* “? extends Fruit”是上界通配符,表示 plate1 中的item存儲的是Fruit及其子類類型(Fruit就是上界),但是無法確定到底是哪一個。
*
* # 由于知道plate1的item存儲的肯定是Fruit或者其子類,所以可以get并轉(zhuǎn)換成Fruit或者其超集(Fruit或者其子類 =get=> Fruit或者其超集)
*
* # 由于不知道plate1中的item到底存儲的是Fruit或者其子類的哪一個,所以沒辦法set。
*/
// getter
Fruit fruit1 = plate1.getItem(); // 正確
Food food1 = plate1.getItem(); // 正確
Meat meat1 = plate1.getItem(); // 錯誤,F(xiàn)ruit不能轉(zhuǎn)成Meat
//setter
plate1.setItem(new Apple()); // 錯誤
plate1.setItem(new Fruit()); // 錯誤,假設(shè)應(yīng)該保存Fruit的子類如Apple,F(xiàn)ruit無法轉(zhuǎn)換成Apple
plate1.setItem(new Food()); // 錯誤
plate1.setItem(new Object()); // 錯誤,假設(shè)應(yīng)該保存的是Fruit,存入Object,Object無法轉(zhuǎn)化成Fruit
// 所以set任何類型都有問題,既無法set
// 構(gòu)造器
Plate<? extends Fruit> plate1_1 = new Plate<>(new Apple()); // 正確,因為構(gòu)造器是“Plate(T item)”,然后“T extents Fruit”
Plate<? extends Fruit> plate1_2 = new Plate<>(new Fruit()); // 正確
Plate<? extends Fruit> plate1_3 = new Plate<>(new Food()); // 正確,因為構(gòu)造器是“Plate(T item)”,然后“T extents Fruit”,T為Food不滿足條件
/**
* "<? super Fruit>" 是下界通配符,表明plate2中的item存儲的是Fruit自身或者其超類(Fruit就是下界),但是不能確定到底是哪一個。
*
* # 由于知道“item”中存儲的肯定是Fruit或這其超類,所以set進去Fruit或者Fruit的子類(Fruit或者其子類 =set=> Fruit或者其超類)。
*
* # get的時候由于不能確定到底存儲的是Fruit或者其超類的哪一個,所以get會出問題,但是所有的類都是Object的子類,所以返回Object沒問題
*/
Plate<? super Fruit> plate2 = new Plate<>(new Fruit());
// setter
plate2.setItem(new Food()); // 錯誤,假設(shè)存儲的是Fruit,F(xiàn)ood沒辦法轉(zhuǎn)成Fruit(下界)
plate2.setItem(new PinkLady()); // 正確
plate2.setItem(new Fruit()); // 正確
// getter
Fruit fruit2 = plate2.getItem(); // 錯誤
Food food2 = plate2.getItem(); // 錯誤
Object object = plate2.getItem(); // 正確
// 構(gòu)造器
Plate<? super Fruit> plate2_1 = new Plate<>(new Food()); // 正確
Plate<? super Fruit> plate2_2 = new Plate<>(new Apple()); // 正確
Plate<? super Fruit> plate2_3 = new Plate<>(new Meat()); // 正確
List<? super Fruit> list = new ArrayList<>();
}
}
class Plate<T> {
private T item;
public Plate(T item) {
this.item = item;
}
public T getItem() {
return item;
}
public void setItem(T item) {
this.item = item;
}
}
class Food {
}
class Meat extends Food {
}
class Fruit extends Food {
}
class Apple extends Fruit {
}
class PinkLady extends Apple {
}
java泛型-上界通配符<? extends XXX> 和下屆通配符<? super XXX>
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
相關(guān)閱讀更多精彩內(nèi)容
- 之前一直對Java泛型中的通配符不是很清楚,前幾天專門研究了一下。Java中的泛型通配符分為以下三種: <? ex...
- 1. extends extends指上界通配符,示例中指的是所有Fruit類及其派生的子類。對該通配符指示的容器...
- 泛型 泛型就是類型參數(shù)化,處理的數(shù)據(jù)類型不是固定的,而是可以作為參數(shù)傳入。泛型是計算機程序中一種重要的思維方式,它...
- 意義不同 ? extends T 表示上界是T ? super T 表示下界是T 用法不同 以List為例List...