1. 程式人生 > >Java 泛型通配符上限和通配符下限(正在整理)

Java 泛型通配符上限和通配符下限(正在整理)

void image ont dag println RR ogr -i orm

<? extends T>上限通配,表示?是T的一個未知子類。
<? super T>下限通配,表示?是T的一個未知父類。

下面來分別講一下

1. <? extends T> 上限通配

這裏?表示一個未知的類,而T是一個具體的類,在實際使用的時候T需要替換成一個具體的類,表示實例化的時候泛型參數要是T的子類。

舉個例子
我們有一個水果類

/**
 * 水果類
 */
public abstract class Fruit {
    public abstract void eat();
}

然後創建兩種水果繼承水果類Fruit

/**
 * 蘋果類
 */
public class Apple extends Fruit {
    @Override
    public void eat() {
        System.out.println("我是蘋果,我是酸酸甜甜的");
    }
}
/**
 * 香蕉類
 */
public class Banana extends Fruit {
    @Override
    public void eat() {
        System.out.println("我是香蕉,我是軟軟的");
    }
}

我們還需要一個吃瓜群眾

/**
 * 吃瓜群眾
 */
public class People<T extends  Fruit> {

    public void eatFruit(T t){
        t.eat();
    }
}

請註意定義People類的時候我們使用了泛型上限表示<T extends Fruit>
我們創建一個類測試一下

public class Test {
    public static void main(String[] args) {
        People<Apple> p1 = new People<>();
        p1.eatFruit(new Apple());
        
        People<Banana> p2 = new People<>();
        p2.eatFruit(new Banana());
    }
}
技術分享圖片 輸出結果.png

若此時我們創建一個橙子類,但不繼承自Fruit父類

/**
 * 橙子類
 */
public class Orange {
    public void eat() {
        System.out.println("我是橙子,我是酸酸的");
    }
}

編譯時期就會報錯,提示Orange不在範圍內,應該要繼承Fruit類


技術分享圖片 編譯報錯.png

2. <? super T> 下限通配

這裏?表示一個未知的類,而T是一個具體的類,在實際使用的時候T需要替換成一個具體的類,表示實例化的時候泛型參數要是T的父類。

例如

public static void addNumbers(List<? super Integer> list) {
    for (int i = 1; i <= 10; i++) {
        list.add(i);
    }
}

這裏表示我們調用這個方法時可以傳入參數是Integer或者Integer的父類,例如:

public class TestLowerBounded {
    public static void addNumbers(List<? super Integer> list) {
        for (int i = 1; i <= 10; i++) {
            list.add(i);
        }
    }

    public static void main(String[] args) {
        List<Integer> list1 = new ArrayList<>();
        addNumbers(list1);

        List<Number> list2 = new ArrayList<>();
        addNumbers(list2);

        List<Object> list3 = new ArrayList<>();
        addNumbers(list3);

        List<String> list4 = new ArrayList<>();
        //編譯錯誤,因為String不是Integer的父類
        //addNumbers(list4);
    }
}

Number和Object都是Integer的父類,所以編譯通過,而String不是Integer的父類,編譯報錯。


以上就是泛型上限通配符和下限通配符的作用了,知識點比較小,希望可以一點一點積累,和大家一起進步。

Java 泛型通配符上限和通配符下限(正在整理)