首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 程式設計入門

Java 編譯警告「未經檢查或不安全的操作」完整解決方案

     編輯:Java 程式設計入門

警告來源

JDK 5 引入泛型,編譯器對原始類型使用發出 unchecked 警告:

List list = new ArrayList(); // 原始類型
list.add("hello");           // 編譯器無法檢查類型安全

三種解決方式

1. 显式指定泛型參數(推薦)

List list = new ArrayList(); // Java 7+ 可寫 new ArrayList<>();
list.add("hello"); // 型別安全

2. 使用 @SuppressWarnings 註解抑制

@SuppressWarnings("unchecked")
List list = new ArrayList(); // 僅在不得不與舊 API 互操作時使用

3. 編譯器參數關閉警告(不建議)

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 → List
  • 若將 List 傳給預期 List 的舊方法,再塞入 Integer,執行期才拋 ClassCastException,這就是「堆污染」
  • @SafeVarargs、Varargs 情況下特別注意

最佳實踐清單

場景做法
新代碼全部使用泛型,鑽石運算子 new ArrayList<>()
第三方無泛型 API邊界處加 @SuppressWarnings("unchecked") 並註釋原因
通配符List 唯讀、List 取出、List 放入
陣列不可建立泛型陣列 new List[10],用 List>
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved