泛型generic
1.泛型的優點:
增加可讀性和穩定性
未使用泛型: List myIntList = new ArrayList();// 1
myIntList.add(new Integer(0));// 2
Integer x = (Integer)myIntList.iterator().next();// 3
使用泛型: (不需轉換動作;編譯器會在編譯時檢查類型)
List<Integer> myIntList = new ArrayList<Integer>(); // 1
myIntList.add(new Integer(0)); // 2
Integer x =myIntList.iterator().next(); // 3
2.在類中使用泛型以及定義泛型方法:
publicclass GenericDemo {
publicstaticvoid main(String[] args) {
//1.泛型的使用,泛型類定義
Person<String> p = new Person<String>("god");
System.out.println(p.getName());
//2.靜態方法的泛型定義
Person.fun(new Integer(3));
}
}
class Person <T> {
private Tname;
public Person(T name){
this.name = name;
}
public T getName() {
returnthis.name;
}
publicstatic <E>void fun(E e) {
System.out.println(e.toString());
}
}
3.泛型的繼承:
a.
Object[] obj =new Object[9];
Integer[] in = new Integer[9];
obj = in; //可以
Set <Object> objSet = new HashSet<Object>();
Set <Integer> inSet = new HashSet<Integer>();
objSet = inSet; //不可以的,出錯
b.
Set <Object> objSet =new HashSet<Object>();
Set <Integer> inSet = new HashSet<Integer>();
//objSet = inSet; //不可以的,出錯
p.fun2(objSet); //可以
p.fun2(inSet); //可以
publicvoid fun2(Set <?extends Object> set) {
System.out.println(set);
}
4. 泛型函數允許類型參數被用來表示方法的一個或多個參數之間的依賴關係,或者參數與其返回值的依賴關係。如果沒有這樣的依賴關係,不應該使用泛型方法。
Add:
泛型上限:<? extends Fruit>與泛型下限<? super Fruit>:
List<? extends Fruit>所應該持有的對象是Fruit的子類,而且具體是哪一個子類還是個未知數,所以加入任何Fruit的子類都會有問題,因爲如果add Apple的話,可能List<? extends Fruit>持有的對象是new ArrayList<Jonathan>()Apple的加入肯定是不行的,如果 如果add Jonathan 的話,可能List<? extends Fruit>持有的對象是new ArrayList<Jonathan的子類>()Jonathan的加入又不合法,所以List<? extends Fruit> list 不能進行add
而List<? super Fruit> list 表示list持有的對象是Fruit的父類,下限是 Fruit,所以list中add Fruit或Fruit的子類是沒有問題的