萬用字元型別由問號表示,如 <?>
中所示。對於通用型別,萬用字元型別為物件型別用於原始型別。
可以將任何已知型別的泛型分配為萬用字元型別。
參考以下範例程式碼:
// MyBag of String type
MyBag<String> stringMyBag = new MyBag<String>("Hi");
// You can assign a MyBag<String> to MyBag<?> type
MyBag<?> wildCardMyBag = stringMyBag;
萬用字元通配型別中的問號(例如,<?>
)表示未知型別。當使用萬用字元宣告引數化型別作為引數型別時,這意味著不知道它的型別。
MyBag<?> unknownMyBag = new MyBag<String>("Hello");
上邊界萬用字元表示萬用字元的上限,如下語法
<? extends T>
這裡,T
是一種型別。 <? extends T>
表示任何型別為T
或其子類是可接受的。
例如,上限可以是數位型別。
如果傳遞任何其他型別,是Number
型別或它的子類,沒有問題。 但是,如果不是Number
型別或其子型別的任何東西都會在編譯時被拒絕。
使用上限作為數位值(Number
),可以將方法定義為 -
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 double sum(MyBag<? extends Number> n1,
MyBag<? extends Number> n2) {
Number num1 = n1.get();
Number num2 = n2.get();
double sum = num1.doubleValue() + num2.doubleValue();
return sum;
}
}
不管為n1
和n2
傳遞的是什麼,它們將始終與Number
的賦值相容,因為編譯器確保傳遞給sum()
方法的引數遵循其宣告中指定的規則 <? extends Number>
。
指定下限萬用字元與指定上限萬用字元相反。使用下限萬用字元的語法是<? super T>
,這表示「任何T
的超型別」。
class MyBag<T> {
private T ref;/*from w w w. j ava 2 s .co m*/
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);
}
}