1.List extend Fruit> list=new ArrayList<>(); 解釋為:集合中元素是繼承自Fruit,究竟是何種類型,編譯器也無法判定。
如果要從集合中讀取類型T的數據,並且不能寫入,可以使用 ? extends 通配符;(Producer Extends)
2.List super Apple> list=new ArrayList<>();解釋為:集合中的元素是Apple的父類,無法判定具體類型。
如果要從集合中寫入類型T的數據,並且不需要讀取,可以使用 ? super 通配符;(Consumer Super)
如果既要存又要取,那么就不要使用任何通配符。
3.>和>
example:package genericity;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
/**
* TypeParameterTest
* 對比>和>
* Created by heqianqian on 2017/6/1.
*/
public class TypeParameterTest {
public static > void mySort1(List list) {
Collections.sort(list);
}
public static > void mySort2(List list) {
Collections.sort(list);
}
public static void main(String[] args) {
List animals = new ArrayList<>();
animals.add(new Animal(1));
animals.add(new Dog(35));
List dogs = new ArrayList<>();
dogs.add(new Dog(100));
dogs.add(new Dog(120));
mySort1(animals);
//mySort1(dogs);
}
}
class Animal implements Comparable {
protected int age;
public Animal(int age) {
this.age = age;
}
@Override
public int compareTo(Animal o) {
return this.age - o.age;
}
}
class Dog extends Animal {
public Dog(int age) {
super(age);
}
}
其中mySort1(dogs) 會編譯報錯Error:(33, 9) java: 無法將類 genericity.TypeParameterTest中的方法 mySort1應用到給定類型;
需要: java.util.List
找到: java.util.List
原因: 推斷類型不符合等式約束條件
推斷: genericity.Animal
等式約束條件: genericity.Animal,genericity.Dog
>類型 T 必須實現 Comparable 接口,並且這個接口的類型是 T。只有這樣,T 的實例之間才能相互比較大小。例如,在實際調用時若使用的具體類是 Dog,那么 Dog 必須 implements Comparable
>類型 T 必須實現 Comparable 接口,並且這個接口的類型是 T 或 T 的任一父類。這樣聲明后,T 的實例之間,T 的實例和它的父類的實例之間,可以相互比較大小。例如,在實際調用時若使用的具體類是 Dog (假設 Dog 有一個父類 Animal),Dog 可以從 Animal 那里繼承 Comparable ,或者自己 implements Comparable 。