java泛型通配符的用法
/**
* 泛型中通配符的使用 無界通配符? 通配符的上限限定和下限限定
*/
public class Test7<T> {
? ?private T value;
? ?public Test7(T v){
? ? ? ?this.value = v;
? ?}
? ?public void printValue(){
? ? ? ?System.out.println(value);
? ?}
? ?//定義一個泛型類 通過類的T設定了value的類型
? ?public static void main(String[] args) {
? ? ? ?Test7<Integer> i7 = new Test7<>(7);
? ? ? ?i7.printValue();
? ? ? ?//調(diào)用類內(nèi)定義好的方法使用 T value
? ?}
}
class ShowValue{
// ? ?public void printValue(Test7 t){
// ? ? ? ?//當在外部調(diào)用Test7時需要設定具體的類型 如果不設定會默認為Object
// ? ?}
// ? ?public void printValue(Test7<Integer> t){
// ? ? ? ?//如果設定為Integer 當需要調(diào)用Test7<String>等其他類型的對象時會無法使用該方法
// ? ?}
? ?public void printValue(Test7<?> t){
? ? ? ?//通過無界通配符? 來代表任意類型的Test7<> 無論什么類型都可以調(diào)用這個方法
? ? ? ?t.printValue();
? ?}
? ?public static void main(String[] args) {
? ? ? ?Test7<Integer> i7 = new Test7<>(7);
? ? ? ?Test7<String> s7 = new Test7<>("7");
? ? ? ?ShowValue s = new ShowValue();
? ? ? ?s.printValue(i7);
? ? ? ?s.printValue(s7);
? ? ? ?//i7和s7都符合Test7<?>
? ? ? ?Test7<?> t7 = i7;
? ? ? ?//引用變量也可以用<?>
? ? ? ?Test7<?> o8 = new Test7<>("");
// ? ? ? ?Test7<Integer> i8 = t7; ?報錯 需要強轉
? ?}
}
class ShowValue2{
? ?public void printValue(Test7<? extends Number> t){
? ? ? ?//可以對通配符的適用范圍進行限定
? ? ? ?//格式 ?<通配符 extends 類名/接口名>
? ? ? ?//將繼承樹中的上限設定為Number 所有Number的子類包括Number都可以使用該方法 其他與Number無關的類無法調(diào)用
? ? ? ?t.printValue();
? ?}
? ?public static void main(String[] args) {
? ? ? ?Test7<Object> o7 = new Test7<>(new Object());
? ? ? ?ShowValue2 s2 = new ShowValue2();
// ? ? ? ?s2.printValue(o7);報錯 在繼承樹中Object在Number的上面 超過了通配符的上限
? ? ? ?Test7<String> s7 = new Test7<>("");
// ? ? ? ?s2.printValue(s7);報錯 String不是Number的子類 無法調(diào)用方法
? ?}
}
class Test8<T extends String>{
? ?//定義泛型類/泛型接口和泛型方法時也可以通過extends限定適用范圍
? ?<T extends Number> void a(){}
}
class Test9{
? ?public void a(Test7<? super Integer> i){}
? ?//super用來限定通配符的下限 在繼承樹中Integer及Integer的父類可以使用該方法
? ?Test7<? super Integer> flag;
? ?//給屬性設定下限 super和extends用法一樣 但super只能用于?通配符
}
//class Test10<?> {} 報錯 ?不能用在泛型類上 所以super也不能用在泛型類上
//泛型不能同時定義上限和下限