[英]Does Java JDK 6 allow non-generic legacy code?
Java JDK 6是否支持舊的非泛型集合,還是會在運行時破壞現有代碼?
如果它支持它,您是否必須啟用它?
因此,例如:
List<Integer> list = new ArrayList<Integer>();
list.add(5);
Alpha a = new Alpha();
a.insert(list);
for (Integer integer : list) {
System.out.println(integer);
}
非通用(舊版代碼):
public class Alpha {
public void insert(List list) {
list.add(new String("50"));
}
}
這樣編譯可以,但是在運行時會中斷。 我以為它將運行良好,並且編譯器會警告您。
泛型排序僅在編譯時存在。 (不完全是;仍然到處都是元數據,但是對象類型本身並沒有受到影響,特別是支持ArrayList
的數組仍然是Object[]
。在這里非常重要。)您可以始終使用泛型類型,就好像它是非泛型類型一樣-編譯器會警告您,但類本身無法阻止您執行此操作。
您的代碼中斷,因為您在此處隱式將數組的每個元素強制轉換為Integer:
for (Integer integer : list) {
System.out.println(integer);
}
您希望在執行時如何處理? 需要明確的是,編譯后的代碼大致等效於:
for (Iterator iterator = list.iterator(); iterator.hasNext(); ) {
Integer integer = (Integer) list.next();
System.out.println(integer);
}
想象一下,您處在一個沒有泛型的世界中,並想一想如果列表中有String
,那該怎么辦(確實如此,這要感謝Alpha
)。 同樣的事情(一ClassCastException
)將與仿制葯出現。
編譯器將對此發出警告。
使用-Xlint選項運行javac,以獲取全部詳細信息。
警告:[未經檢查]未檢查對add(E)作為原始類型java.util.List list.add(new String(“ 50”))的成員的調用。
如果要使用無類型(原始類型)列表,則只需使用類似的舊版代碼創建一個:
List list = new ArrayList();
但是,當您將添加到列表中的字符串轉換為整數時,代碼在運行時仍將失敗。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.