您好,登錄后才能下訂單哦!
就是指編譯器編譯帶類型說明的集合時會去掉“類型”信息
泛型是提供給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類型一樣,即字節碼一致
System.out.println(collection2.getClass().getName());
//class均為java.util.ArrayList,并無實際類型參數信息
}
}
輸出
true
java.util.ArrayList
為何會返回true
使用反射可跳過編譯器,往某個泛型集合加入其它類型數據。
public class GenericTest {
public static void main(String[] args) {
swap(new String[]{"111","222"},0,1);//編譯通過
//swap(new int[]{1,2},0,1);
//編譯不通過,因為int不是引用類型
swap(new Integer[]{1,2},0,1);//編譯通過
}
/*交換數組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;
}
}
但注意基本類型有時可以作為實參,因為有自動裝箱和拆箱。
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
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。