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