泛型
jdk5.0新增特性
注意:1.泛型的類型必須是類势誊,不能是基本數(shù)據(jù)類型剑梳。需要用到基本數(shù)據(jù)類型的位置唆貌,用包裝類替換
2.若實(shí)例化時(shí),沒有指明泛型的類型垢乙。默認(rèn)指明泛型的類型锨咙。默認(rèn)類型為java.lang.Object類型
3.jdk7后新特性:類型推斷
ArrayList<String> list = new ArrayList<String>();
//新特性,前類型推斷了后類型
ArrayList<String> list1 = new ArrayList<>();
如何自定義泛型類追逮、泛型接口酪刀;泛型方法
1.定義泛型類
public class OrderT01<T> {//泛型類
String name;
int age;
T orderT;
}
實(shí)例化時(shí)指明泛型類型粹舵,操作更嚴(yán)謹(jǐn)
//未對(duì)操作的泛型指定需要的類型,默認(rèn)Object類型
OrderT01 o = new OrderT01();
o.setOrderT("hong");
o.setOrderT(12);
//對(duì)泛型指定類型
OrderT01<String> o1 = new OrderT01<>();
o1.setOrderT("hong");
// o1.setOrderT(12);//報(bào)錯(cuò)
繼承泛型時(shí):
//1.繼承泛型類時(shí)骂倘,子類也必須有泛型標(biāo)識(shí);SubOrder01仍是泛型類
//public class SubOrder01<T> extends OrderT01<T> {
//
//}
//2.對(duì)繼承的父類泛型確定其類型時(shí)眼滤,默認(rèn)子類也為此類型;SubOrder01不是泛型類
public class SubOrder01 extends OrderT01<Integer> {
}
注意:
//1.泛型類的構(gòu)造器和普通類的構(gòu)造方式一樣
public class OrderT01<T> {//泛型類
T orderT;
public OrderT01() {
}
}
//2.不同類型的泛型不能相互賦值
ArrayList<String> l1 = null;
ArrayList<Integer> l2 = null;
//l1=l2;//泛型不同的引用不能相互賦值
//3.若泛型結(jié)構(gòu)是一個(gè)接口或抽象類历涝,則不可以創(chuàng)建泛型類的對(duì)象
//4.靜態(tài)方法中诅需,不能使用反省類;原因是荧库,泛型類是在創(chuàng)建對(duì)象的時(shí)候使用堰塌,而靜態(tài)結(jié)構(gòu)早于對(duì)象的創(chuàng)建
public class OrderT01<T> {//泛型類
public static void show(T t){
}
}
//5.異常類不能是泛型類
//6.
//編譯不通過,原因是分衫,此方式是創(chuàng)建對(duì)象场刑,表明T的類型已經(jīng)確定,但T只是一個(gè)參數(shù)蚪战,并沒有指定確定的類型
//T[] t = new T[10];
//此種方式可以編譯通過牵现,將創(chuàng)建的Object類型數(shù)組強(qiáng)轉(zhuǎn)成泛型數(shù)組(T[])
T[] t = (T[]) new Object[10];
//7.子父類關(guān)系泛型2.泛型方法:可以聲明為靜態(tài)的
一個(gè)泛型類中存在如下兩個(gè)方法,其泛型用<E>表示邀桑,
public class Test<T>{//實(shí)例化Test時(shí)瞎疼,確定其T類型
<T> T[] toArray(T[] a);//泛型方法
void add(E e); //非泛型方法
}
舉例:自定義泛型方法
public class GenericMethod {
//泛型方法,在方法中出現(xiàn)了泛型的結(jié)構(gòu)概漱,泛型參數(shù)和類的泛型沒有任何關(guān)系
//即丑慎,泛型方法所屬類是不是泛型都沒關(guān)系
//List<E>返回E類型的List數(shù)組;E[] arr參數(shù)為E類型的數(shù)組瓤摧;<E>表示此時(shí)的E是一個(gè)泛型參數(shù),不是一個(gè)類
public <E> List<E> copyFromArrayList(E[] arr){
ArrayList<E> list = new ArrayList<>();
for(E e : arr){
list.add(e);
}
return list;
}
}
GenericMethod g = new GenericMethod();
Integer[] arr = new Integer[]{1,2,5,2};
//泛型方法在調(diào)用時(shí)指明泛型類型Integer
List<Integer> integers = g.copyFromArrayList(arr);
for(Integer i : integers){
System.out.println(i);
}
//泛型方法可以聲明為靜態(tài)的玉吁,原因是:泛型參數(shù)是在調(diào)用方法時(shí)才確定其類型照弥,并非在實(shí)例化時(shí)確定
public static <E> List<E> copyFromArrayList(E[] arr){}
泛型在繼承方面的體現(xiàn)
雖然A類是B類的父類,但是G<A>和G<B>二者不具備子父類關(guān)系进副,二者是并列的这揣;A類是B類的父類(接口),A<G>是B<G>的父類
ArrayList<Object> a1 = null;
ArrayList<String> a2 = null;
a1 = a2;
List<String> l = null;
ArrayList<String> a = null;
l = a;
通配符(影斑?)的使用
雖然A類是B類的父類给赞,但是G<A>和G<B>二者不具備子父類關(guān)系,但二者共同的父類是G<矫户?>
ArrayList<Object> a1 = null;
ArrayList<String> a2 = null;
ArrayList<?> a = null;
a = a1;
a = a2;
使用通配符后數(shù)據(jù)的讀取和寫入操作
List<?> l = null;
List<String> l2 = new ArrayList<>();
l2.add("AA");
l2.add("BB");
l2.add("CC");
l = l2;
//添加(寫入):除null之外片迅,不能向 List<?>添加數(shù)據(jù)
// l.add("s");
l.add(null);
//獲取(讀冉粤伞):允許讀取數(shù)據(jù)柑蛇,類型為Object
Object o = l.get(0);
System.out.println(o);//AA
有限制條件的通配符使用
? extends A:( 數(shù)學(xué)中理解芥挣,(-oo,A] )
G<? extends A>可以作為G<A>和G<B>的父類,其中B是A的子類
? super A:( 數(shù)學(xué)中理解耻台,[A,+oo) )
G<? super A>可以作為G<A>和G<B>的父類空免,其中B是A的父類