package Dec2016;
import java.util.ArrayList;
import java.util.List;
public class Ques1216 {
public static void main(String[] args) {
List<String> list01 = new ArrayList<String>();
List<Integer> list02 = new ArrayList<Integer>();
System.out.println(list01.getClass() == list02.getClass());
}
}
請問主程序輸出結果是什麼?
輸出結果:true
Java 泛型採用類型擦除機制,編譯器在編譯階段會將泛型類型參數擦除為其邊界類型(無界時為 Object)。運行時期,JVM 並不知道泛型的具體類型參數。
List<String> 和 List<Integer> 編譯後都變為原始類型 ListArrayList 實例,getClass() 返回同一個 Class<ArrayList> 對象list01.getClass() == list02.getClass() 為 true// 以下代碼編譯報錯,證明泛型信息在編譯期被擦除
List<String> list = new ArrayList<>();
// list.add(123); // 編譯錯誤:類型不匹配
// 但通過反射可繞過編譯期檢查
Method method = list.getClass().getMethod("add", Object.class);
method.invoke(list, 123); // 運行時成功添加 Integer 到 List<String>
System.out.println(list); // 輸出: [123]
Class 對象instanceof 不能用於泛型類型檢查(如 list instanceof List<String> 編譯錯誤)本題考察 Java 泛型核心機制,是高頻面試題,務必掌握「擦除法」原理及其帶來的限制與變通方案。