Java 泛型通配符上限和通配符下限(正在整理)
阿新 • • 發佈:2018-06-20
void image ont dag println RR ogr -i orm
https://www.jianshu.com/p/66bd729bc129
編譯報錯.png
<? 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 泛型通配符上限和通配符下限(正在整理)