Java 發生Unchecked cast警告


參考以下博文:https://my.oschina.net/u/4410452/blog/3371783

在嘗試講序列化的對象讀取到內存時,以下強轉類型代碼

this.booklist = (ArrayList<Book>) ois.readObject();

發生了該警告提醒

Unchecked cast: 'java.lang.Object' to 'java.util.ArrayList<Book>' 
編譯器提示這種強制轉換並未做類型檢驗,強制轉換並不安全,可能會拋出異常導致程序崩潰。
參考過其他博客,有些建議使用
@SuppressWarnings("unchecked")

  來解決編譯器警告,但並不安全,這種做法只是讓編譯器忽略該警告。

以下方法可以是根據我自己的ArrayList<Book>調整的,需要根據自己的類調整

    /**
     * 防止強轉出現警告
     * @param obj   強轉對象
     * @param clazz 強轉類型內含類型
     * @param <T>   泛型
     * @return
     */
    public static <T> ArrayList<T> castList(Object obj, Class<T> clazz)
    {
        ArrayList<T> result = new ArrayList<T>();
        if(obj instanceof ArrayList<?>)
        {
            for (Object o : (ArrayList<?>) obj)
            {
                result.add(clazz.cast(o));
            }
            return result;
        }
        return null;
    }
}

該方法接受兩個參數,一個是obj,即需要強轉的對象,clazz表示內嵌類型的.class參數

使用方法如下

try(FileInputStream fis = new FileInputStream("book.txt")){
            ObjectInputStream ois = new ObjectInputStream(fis);
            //  防止出現強制轉換警告Unchecked cast
            this.booklist = castList(ois.readObject(), Book.class);
        } catch (IOException | ClassNotFoundException e) {

        }

另外需要強轉map類型時,使用方法也有所不同

/**
     * 防止出現強轉警告
     * @param obj   強轉對象
     * @param clazz1    HashMap的key
     * @param clazz2    value
     * @param <K>   Key泛型
     * @param <V>   Value泛型
     * @return
     */
    public static <K,V> HashMap<K,V> castHashMap(Object obj, Class<K> clazz1, Class<V> clazz2)
    {
        HashMap<K,V> result = new HashMap<K,V>();
        if(obj instanceof HashMap<?,?>)
        {
            for (Object o : ((HashMap<?, ?>) obj).keySet()) {
                result.put(clazz1.cast(o),clazz2.cast(((HashMap<?, ?>) obj).get(o)));
            }
            return result;
        }
        return null;
    }

使用實例

try (FileInputStream fis = new FileInputStream("ExpressDao.txt")){
            ObjectInputStream ois = new ObjectInputStream(fis);
            //  防止出現強轉警告
            this.data = castHashMap(ois.readObject(), Integer.class, Express.class);
        } catch (IOException | ClassNotFoundException e) {

        }

 


免責聲明!

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



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