JDK 5 引入泛型,編譯器對原始類型使用發出 unchecked 警告:
List list = new ArrayList(); // 原始類型
list.add("hello"); // 編譯器無法檢查類型安全
List list = new ArrayList(); // Java 7+ 可寫 new ArrayList<>();
list.add("hello"); // 型別安全
@SuppressWarnings("unchecked")
List list = new ArrayList(); // 僅在不得不與舊 API 互操作時使用
javac -Xlint:unchecked MyClass.java
// 或
javac -nowarn MyClass.java
import java.util.*;
public class CollectionDemo {
public static void main(String[] args) {
// ❌ 產生警告
Collection c1 = new ArrayList(25);
c1.add("one");
// ✅ 無警告
Collection c2 = new ArrayList<>(25);
c2.add("one");
// 迭代器也應泛型化
for (Iterator it = c2.iterator(); it.hasNext(); ) {
System.out.println(it.next());
}
}
}
List → ListList 傳給預期 List 的舊方法,再塞入 Integer,執行期才拋 ClassCastException,這就是「堆污染」@SafeVarargs、Varargs 情況下特別注意| 場景 | 做法 |
|---|---|
| 新代碼 | 全部使用泛型,鑽石運算子 new ArrayList<>() |
| 第三方無泛型 API | 邊界處加 @SuppressWarnings("unchecked") 並註釋原因 |
| 通配符 | List> 唯讀、List extends T> 取出、List super T> 放入 |
| 陣列 | 不可建立泛型陣列 new List,用 List |