我們可以在方法聲明中定義類(lèi)型參數(shù),它們?cè)诜椒ǖ姆祷仡?lèi)型之前的尖括號(hào)中指定。
包含泛型方法聲明的類(lèi)型不必是泛型類(lèi)型。
我們可以在非靜態(tài)方法聲明中使用為泛型類(lèi)型指定的類(lèi)型參數(shù)。
以下代碼顯示如何為方法m1()定義新的類(lèi)型參數(shù)V.
新類(lèi)型參數(shù)V強(qiáng)制方法m1()的第一個(gè)和第二個(gè)參數(shù)為相同類(lèi)型。
第三個(gè)參數(shù)必須是相同的類(lèi)型T,這是類(lèi)實(shí)例化的類(lèi)型。
class MyBag<T> { private T ref; public MyBag(T ref) { this.ref = ref; } public T get() { return ref; } public void set(T a) { this.ref = a; } } class Test<T> { public <V> void m1(MyBag<V> a, MyBag<V> b, T c) { } }
要傳遞方法的形式類(lèi)型參數(shù)的實(shí)際類(lèi)型參數(shù),我們必須在方法調(diào)用中的點(diǎn)和方法名之間的尖括號(hào)<>中指定它。
class MyBag<T> { private T ref; public MyBag(T ref) { this.ref = ref; } public T get() { return ref; } public void set(T a) { this.ref = a; } } class Test<T> { public <V> void m1(MyBag<V> a, MyBag<V> b, T c) { } } public class Main { public static void main(String[] argv) { Test<String> t = new Test<String>(); MyBag<Integer> iw1 = new MyBag<Integer>(new Integer(201)); MyBag<Integer> iw2 = new MyBag<Integer>(new Integer(202)); // Specify that Integer is the actual type for the type parameter for m1() t.<Integer>m1(iw1, iw2, "hello"); t.m1(iw1, iw2, "hello"); } }
以下代碼顯示了如何聲明泛型靜態(tài)方法。
我們不能在靜態(tài)方法內(nèi)引用包含類(lèi)的類(lèi)型參數(shù)。
靜態(tài)方法只能引用它自己聲明的類(lèi)型參數(shù)。
以下靜態(tài)通用類(lèi)型定義了類(lèi)型參數(shù)T,用于約束參數(shù)source和dest的類(lèi)型。
class MyBag<T> { private T ref; public MyBag(T ref) { this.ref = ref; } public T get() { return ref; } public void set(T a) { this.ref = a; } } public class Main { public static <T> void copy(MyBag<T> source, MyBag<? super T> dest) { T value = source.get(); dest.set(value); } public static void main(String[] argv) { } }
要為靜態(tài)方法調(diào)用指定實(shí)際的類(lèi)型參數(shù),我們可以這樣做:
Main.<Integer>copy(iw1, iw2);
我們可以為構(gòu)造函數(shù)定義類(lèi)型參數(shù)。
下面的代碼定義了類(lèi)Test的構(gòu)造函數(shù)的類(lèi)型參數(shù)U.
它放置一個(gè)約束,即構(gòu)造函數(shù)的類(lèi)型參數(shù)U必須是相同的,或者它的類(lèi)類(lèi)型參數(shù)T的實(shí)際類(lèi)型的子類(lèi)型。
public class Test<T> { public <U extends T> Test(U k) { } }
要為構(gòu)造函數(shù)指定實(shí)際的類(lèi)型參數(shù)值,請(qǐng)?jiān)谛逻\(yùn)算符和構(gòu)造函數(shù)名稱(chēng)之間的尖括號(hào)中指定它,如以下代碼段所示:
class Test<T> { public <U extends T> Test(U k) { } } public class Main { public static void main(String[] argv) { // Specify the actual type parameter for the constructor as Double Test<Number> t1 = new<Double> Test<Number>(new Double(1.9)); // Let the compiler figure out, Integer is // the actual type parameter for the constructor Test<Number> t2 = new Test<Number>(new Integer(1)); } }
Java 7在泛型類(lèi)型的對(duì)象創(chuàng)建表達(dá)式中增加了對(duì)類(lèi)型推斷的有限支持。
對(duì)于以下語(yǔ)句:
List<String> list = new ArrayList<String>();
在Java 7中,可以在上面的語(yǔ)句中指定空尖括號(hào),稱(chēng)為菱形操作符或簡(jiǎn)單的菱形<>作為ArrayList的類(lèi)型參數(shù)。
List<String> list = new ArrayList<>();
如果我們不在對(duì)象創(chuàng)建表達(dá)式中為泛型類(lèi)型指定類(lèi)型參數(shù),那么類(lèi)型是原始類(lèi)型,編譯器生成未檢查的警告。
例如,以下語(yǔ)句將編譯未選中的警告:
List<String> list = new ArrayList(); // Generates an unchecked warning
我們不能創(chuàng)建泛型的異常類(lèi)。并且沒(méi)有泛型的匿名類(lèi)。
更多建議: