使用 Ant 執行 JasperReports 範例 build.xml 時編譯失敗,提示:
[javac] 注意: ChartsApp.java 使用了未經檢查或不安全的操作。
[javac] 注意: 要了解詳細信息,請使用 -Xlint:unchecked 重新編譯。
根本原因:JDK 5.0 引入泛型,編譯器對非泛型集合操作(如 Map parameters = new HashMap())發出未檢查警告。
-source 1.4(或 1.5)<javac srcdir="${src.dir}" destdir="${classes.dir}">
<classpath refid="classpath"/>
<compilerarg line="-source 1.5"/>
</javac>
結果:編譯通過,報表正常顯示。注意:需用 line 而非 value 屬性。
@SuppressWarnings("unchecked") 註解在方法前加註解。實測無效:JDK 5.0 javac 尚不支援此註解,需 JDK 5.1+(Java 6)支援。
// 原碼
Map parameters = new HashMap();
parameters.put("MaxOrderID", new Integer(12500));
// 修正
Map<String, Integer> parameters = new HashMap<String, Integer>();
parameters.put("MaxOrderID", new Integer(12500));
// 或
Map<Object, Object> parameters = new HashMap<Object, Object>();
結果:編譯通過,報表正常。優點:消除警告根源,提升代碼類型安全。
右鍵 build.xml → 執行 → 構成和執行 → 參數 → 程式參數輸入 -Xlint:unchecked。實測不生效。
javac 任務加 compilerarg 顯示警告但不阻擋編譯<javac srcdir="src" destdir="${classdir}"
deprecation="on" encoding="Windows-31J" debug="on">
<compilerarg value="-Xlint:unchecked"/>
<classpath refid="project.class.path"/>
</javac>
結果:編譯通過,顯示警告而非錯誤:
[javac] ChartsApp.java:115: 警告: [unchecked] 對作為普通類型 java.util.Map 的成員的 put(K,V) 的調用未經檢查
| 場景 | 推薦方案 | 理由 |
|---|---|---|
| 舊專案快速遷移、不想動代碼 | 方案一 (-source 1.4) | 零代碼修改,相容舊語法 |
| 新專案/重構期、追求代碼品質 | 方案三 (泛型化) | 治本,編譯期類型檢查,減少運行時 ClassCastException |
| 需保留舊代碼風格但要看詳細警告 | 方案五 (compilerarg) | 不阻擋建置,可見具體警告位置 |
Map<String,Integer> 變回 MapHashMap() 無類型參數視為原始類型,失去泛型檢查-Xlint:unchecked 開啟編譯器對此類情況的詳細報告