概要:介紹泛型的幾種使用方法。
簡單類和接口的定義:
public class Pair<T> {
private T first;
public Pair(T first) {
this.first = first;
}
public T getFirst() {
return first;
}
}
public interface ICache<K, V> {
public V put(K key, V value);
public V get(K key);
}
ps:類型變量使用大寫形式,比較短。在java庫中,變量E表示集合的元素,K和V分別表示表的關鍵字與值的類型。T表示“任意類型”。
泛型方法:
public class Test {
public static <T> T getObj(T a) {
return a;
}
public static void main(String args[]) {
String str = getObj("a");
Student student = getObj(new Student());
}
}
class Student {
}
實際代碼從肯定不會出現例子中的這種情況,不過這體現了泛型方法一種顯而易見的優勢:T可以是“任意類型”。
類型變量的繼承:
public class ArrayTest {
public static <T extends Comparable> T min(T[] a) {
if (a == null || a.length == 0)
return null;
T smallest = a[0];
for (int i = 1; i < a.length; i++) {
if (smallest.compareTo(a[i]) > 0) {
smallest = a[i];
}
}
return smallest;
}
}
在這裏,T要確保有compareTo方法,所以採用<T extends Comparable>,將T限制爲現實了Comparable接口。
ps:<T extends bounding Type>表示T應該是綁定類型的字類型(subtype),T和綁定類型可以是類,也可以是接口。我覺得可以這樣理解,這裏的關鍵字extends非繼承中的那個關鍵字extends,對編譯器來說,都只是一個代號。設計者選擇關鍵字extends是因爲這裏更接近子類的概念。
參考資料:
《java核心技術卷一》
thomescai http://blog.csdn.net/thomescai(轉載請保留)