java泛型-上界通配符<? extends XXX> 和下屆通配符<? super XXX>

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 {

}

?著作權(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ù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容