您好,登錄后才能下訂單哦!
就是指編譯器編譯帶類型說明的集合時會去掉“類型”信息
泛型是提供給javac編譯器使用的,限定集合的輸入類型,編譯器編譯帶類型說明的集合時會去掉“類型”信息。
public class GenericTest {
public static void main(String[] args) {
new GenericTest().testType();
}
public void testType(){
ArrayList<Integer> collection1 = new ArrayList<Integer>();
ArrayList<String> collection2= new ArrayList<String>();
System.out.println(collection1.getClass()==collection2.getClass());
//兩者class類型一樣,即字節(jié)碼一致
System.out.println(collection2.getClass().getName());
//class均為java.util.ArrayList,并無實(shí)際類型參數(shù)信息
}
}
輸出
true
java.util.ArrayList
為何會返回true
使用反射可跳過編譯器,往某個泛型集合加入其它類型數(shù)據(jù)。
public class GenericTest {
public static void main(String[] args) {
swap(new String[]{"111","222"},0,1);//編譯通過
//swap(new int[]{1,2},0,1);
//編譯不通過,因?yàn)閕nt不是引用類型
swap(new Integer[]{1,2},0,1);//編譯通過
}
/*交換數(shù)組a 的第i個和第j個元素*/
public static <T> void swap(T[]a,int i,int j){
T temp = a[i];
a[i] = a[j];
a[j] = temp;
}
}
但注意基本類型有時可以作為實(shí)參,因?yàn)橛凶詣友b箱和拆箱。
public class GenericTest {
public static void main(String[] args) {
new GenericTest().testType();
int a = biggerOne(3,5);
//int 和 double,取交為Number
Number b = biggerOne(3,5.5);
//String和int 取交為Object
Object c = biggerOne("1",2);
}
//從x,y中返回y
public static <T> T biggerOne(T x,T y){
return y;
}
}
Error:(17, 29) java: 不兼容的類型: 推斷類型不符合上限
推斷: java.lang.Number&java.lang.Comparable<? extends java.lang.Number&java.lang.Comparable<?>>
上限: java.lang.String,java.lang.Object
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。