zoukankan      html  css  js  c++  java
  • 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) {
    
            }
  • 相关阅读:
    数据绑定
    快速上手小程序云开发
    微信小程序敏捷开发实战
    测试驱动开发实践4————testSave之新增文档分类
    测试驱动开发实践3————从testList开始
    测试驱动开发实践2————测试驱动开发之前
    测试驱动开发实践1————项目代码生成
    构建微服务开发环境8————Hello 微服务
    构建微服务开发环境7————使用Github管理项目代码的版本
    构建微服务开发环境6————利用npm安装前端框架
  • 原文地址:https://www.cnblogs.com/misaki-workshop/p/13423470.html
Copyright © 2011-2022 走看看