下面來分別講一下
③.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()); }
以上就是泛型上限通配符和下限通配符的作用了,知識點比較小,希望可以一點一點積累,和大家一起進步。