可以在方法聲明中定義類型參數(shù),它們在方法的返回類型之前的尖括號中指定。包含泛型方法聲明的類型不必是通用類型??梢栽诜庆o態(tài)方法聲明中使用為泛型類型指定的類型參數(shù)。
以下代碼顯示如何為方法m1()
定義新的類型參數(shù)V
。新類型參數(shù)V
強制將方法m1()
的第一個和第二個參數(shù)必須為相同類型。
第三個參數(shù)必須與類型T
相同,這是類實例化的類型。
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) {
}
}
要傳遞方法的形式類型參數(shù)的實際類型參數(shù),必須在方法調(dià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)方法中引用包含類的類型參數(shù)。
靜態(tài)方法只能引用它自己聲明的類型參數(shù)。以下靜態(tài)通用類型定義了類型參數(shù)T
,用于約束參數(shù)source
和dest
的類型。
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ù),可以這樣做:
Main.<Integer>copy(iw1, iw2);
可以為構(gòu)造函數(shù)定義類型參數(shù)。下面的代碼定義了類Test
的構(gòu)造函數(shù)的類型參數(shù)U
。它放置一個約束,構(gòu)造函數(shù)的類型參數(shù)U
必須是相同的,或者它的類類型參數(shù)T
類型的子類型。
public class Test<T> {
public <U extends T> Test(U k) {
}
}
要為構(gòu)造函數(shù)指定實際的類型參數(shù)值,請在 new
運算符和構(gòu)造函數(shù)名稱之間的尖括號中指定它,如以下代碼段所示:
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));
}
}
Java7在通用類型的對象創(chuàng)建表達式中增加了對類型推斷的一些有限支持。
對于以下語句:
List<String> list = new ArrayList<String>();
在Java7
中,可以在上面的語句中指定空尖括號,稱為菱形操作符或簡單的菱形<>
作為ArrayList
的類型參數(shù)。
List<String> list = new ArrayList<>();
如果不在對象創(chuàng)建表達式中為通用類型指定類型參數(shù),那么類型是原始類型,編譯器生成未檢查的警告。
例如,以下語句將編譯產(chǎn)生未選中的警告:
List<String> list = new ArrayList(); // Generates an unchecked warning
不能創(chuàng)建通用的異常類。 并且沒有通用的匿名類。