簡體   English   中英

Java JDK 6是否允許使用非通用遺留代碼?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM