JDK 5 引入泛型,編譯器對**裸類型** 使用發出 `unchecked` 警告。典型代碼:
Map parameters = new HashMap(); // 裸類型
parameters.put("MaxOrderID", new Integer(12500));
編譯輸出:
注意:使用了未經檢查或不安全的操作。
注意:要了解詳細信息,請使用 -Xlint:unchecked 重新編譯。
Ant build.xml:
<javac srcdir="${src.dir}" destdir="${classes.dir}">
<compilerarg line="-source 1.5"/> <!-- 注意是 line 而非 value -->
</javac>
原理:1.4 無泛型語法,編譯器不檢查。缺點:失去泛型類型安全、無法使用 JDK 5+ 語法。
@SuppressWarnings("unchecked")
public void main(...) { ... }
原因:文中指出 **JDK 5.0 `javac` 不支持此註解**,需 JDK 5.1+ (實際 JDK 6 才完整支持)。
// 明確類型參數
Map parameters = new HashMap();
parameters.put("MaxOrderID", 12500); // 自動裝箱
// 或故意寬鬆但消除警告
Map
優點:獲得編譯期類型檢查、代碼自文檔化、無警告。最佳實踐。
Eclipse → Run → Arguments → VM arguments 添加 `-Xlint:unchecked` 對 `javac` 任務無效。
<javac srcdir="src" destdir="${classdir}" ...>
<compilerarg value="-Xlint:unchecked"/>
</javac>
效果:編譯通過,控制台顯示具體警告行:
警告:[unchecked] 對作為普通類型 Map 的 put(K,V) 調用未經檢查
缺點:警告仍存在,僅顯示詳情,未從根本消除。
`unchecked` 警告是泛型類型系統在裸類型使用處的防線。**補全泛型參數**是正解;**降級源版本**是妥協;**抑制警告**是針對不可避免的舊代碼邊界的精準手術刀。建立團隊「零 unchecked 警告」規範,納入 CI 檢查門禁。