參考以下博文: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) { }