Java 泛型通配符上限和通配符下限


 
 

  下面來分別講一下

③.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());
    }
}

 

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

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

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

編譯報錯

 ③.2<? extends T> 上限通配

表示只能接收Number這個類以及這個類的子類的數據類型。(extends表繼承,就是這個類下面的東西)再舉個例子如下

public static void function(Student<? extends Number> s){  
    System.out.println("姓名是:"+s.getName());  
} 

 

④.1<? 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的父類,編譯報錯。

 

④.2<? super T> 下限通配

表示只能接收Number這個類以及這個類的父類的數據類型。(super表父類,超過這個類的東西)再舉個例子如下

public static void function(Student<? super Number> s){  
    System.out.println("姓名是:"+s.getName());  
} 

 

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


免責聲明!

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



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