泛型
在類(接口)定義的時候,還不能明確具體的類型。
在使用的時候才明確類型,這個叫做泛型。
泛型只能是引用類型,如果需要使用到基本數據類型,實際要用到的是包裝類型。
int--->Integer char--->Character double--->Double short--->Short long--->Long byte--->byte
如 1.toString() 不能通過,而Integer.toString(1)可以。
Integer b=10; 反編譯查看是Integer b=Integer.valueOf(10);這叫自動裝箱
泛型類
單個參數的泛型類
class 類名<泛型類型>{
}
多個參數的泛型類型
class 類名<泛型類型1,泛型類型2>{
}
class Person<M,N>{ }
泛型類繼承的時候:
1.在繼承的時候就指明瞭泛型類型
class Chinese extends Person<String,Integer>{ }
2.在繼承的時候不指名泛型類型
class Chinese<M,N> extends Person<M,N>{ }
在實例化的時候才指明泛型類型。
Chinese<String,Integer> chinese=new Chinese<String,Integer>();
方法2更實用。
泛型接口
語法:
interface 接口名<T> {}
interface 接口名<M,N> {}
實現語法:
1.class 類名 implements 接口名<具體的泛型類型>{}
2.class 類名<T> implements 接口名<T> {}
等到具體實例化的時候再指定泛型類型
泛型方法
語法:public <T> void 方法名(T t){
}
使用泛型方法,可以將類型的指定放在方法調用的時候。
泛型的限制
class 類名<T extends Car>{
}
這裏T必須是Car或其子類
泛型通配符
?代表通配符,可以是任意類型
List<? extends Car> list3=new ArrayList<Car>();
? extends Car:代表此泛型類型必須是Car或其子類
List<? super Phoenix> list=new ArrayList<Bike>();
? super Phoenix:代表此泛型類型必須是Phoenix或其父類