泛型方法
泛型方法可以定義在泛型類中,也可以定義在普通類中。定義泛型方法時,將泛型變量用尖括號包裹,並且將泛型變量置於方法修飾符和方法返回值之間。
public class ArrayAlg{
public static <T> T getMiddle(T... a){
return a[a.length / 2];
}
}
當調用一個泛型方法時,在方法名前的尖括號中放入具體的類型,實例化類型參數:
String middle = ArrayAlg.<String>getMiddle("Hello","World","!");
在大多數情況下,調用泛型方法可以省略對類型參數,編譯器有足夠的信息能夠推斷出如何實例化類型參數,下面的代碼與上面的代碼具有相同的效果:
String middle = ArrayAlg.getMiddle("Hello","World","!");
編譯器根據傳入方法的參數(“Hello”、“World”、”!“)推斷出應該使用String實例化類型參數T。
在少部分特殊的情況下,編譯器無法推斷出如何實例化類型參數,比如下面的代碼:
double middle = ArrayAlg.getMiddle(1.01,2.02,3);
解釋這句代碼有兩種方法,且兩種方法都是合法的。簡單的說,編譯器會自動將1.01和2.02打包成Double對象,將3打包成Integer對象,因為不能確定到底是使用Double還是Integer實例化類型參數T,編譯器將嘗試尋找Double和Integer的共同父類。事實上,將會找到兩個共同父類——Number和Comparable接口,其本生也是一個泛型類型。最終,編譯器無法判斷到底使用什么類型實例化類型參數,因此報錯。在這種情況下,可采取的補救措施時將所有參數寫成double值。