Unchecked cast: java.lang.Object to java.util.List問題的解決


1、問題的代碼

    public static void main(String[] args) {    
        List<String> object = (List<String>) getObject();
        for (String s : object) {
            System.out.println(s);
        }
    }

    public static Object getObject(){
        ArrayList<String> list = new ArrayList<>();
        list.add("one");
        list.add("two");
        return list;
    }

2、出現的問題

java中如果需要將一個object轉成list,大部分人會直接使用強制類型轉換:(List<String>) obj這樣。這樣強制轉換編譯會提示Unchecked cast: 'java.lang.Object' to 'java.util.List<java.lang.String>',編譯器的意思該強制類型轉換並未做類型校驗,強制轉換並不安全,可能會拋出異常導致程序崩潰。

問題的代碼:
在這里插入圖片描述

將提示展開后:

在這里插入圖片描述

Unchecked cast: 'java.lang.Object' to 'java.util.List<java.lang.String>' less... (Ctrl+F1) 
Signals places where an unchecked warning is issued by the compiler, for example:

  void f(HashMap map) {
    map.put("key", "value");
  }
  
Hint: Pass -Xlint:unchecked to javac to get more details.

3、問題的解決

在很多博客中有人會建議用@SuppressWarnings("unchecked")解決編譯器警告,這種方法是極為不妥的,因為它只是用來告訴編譯器忽略警告,而警告卻實實在在的存在。

方式一:使用@SuppressWarnings("unchecked")忽略問題

簡介: java.lang.SuppressWarnings是J2SE5.0中標准的Annotation之一。可以標注在類、字段、方法、參數、構造方法,以及局部變量上。
作用: 告訴編譯器忽略指定的警告,不用在編譯完成后出現警告信息。
使用:
@SuppressWarnings(“unchecked”)
告訴編譯器忽略 unchecked 警告信息,如使用List,ArrayList等未進行參數化產生的警告信息。
@SuppressWarnings(“all”)
抑制所有類型的警告。
在這里插入圖片描述

    public static void main(String[] args) {
        @SuppressWarnings("unchecked")
        List<String> object = (List<String>) getObject();
        for (String s : object) {
            System.out.println(s);
        }
    }

方式二:正確的方式

    public static void main(String[] args) {
        Object object = getObject();
        if (object instanceof ArrayList<?>) {
            List<?> obj = (List<?>) object;
            for (Object o : obj) {
                System.out.println(String.class.cast(o));
            }
        }

方式三:將方式二封裝為工具類使用

使用工具類

    public static void main(String[] args) {
        Object obj = getObject();
        List<String> arrys = castList(obj, String.class);
        for (String once : arrys) {
            System.out.println(once);
        }
    }

工具類

    public static <T> List<T> castList(Object obj, Class<T> clazz)
    {
        List<T> result = new ArrayList<T>();
        if(obj instanceof List<?>)
        {
            for (Object o : (List<?>) obj)
            {
                result.add(clazz.cast(o));
            }
            return result;
        }
        return null;
    }


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM