Unchecked cast: java.lang.Object to java.util.List问题的解决

简介: Unchecked cast: java.lang.Object to java.util.List问题的解决

@[toc]


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;
    }

方式四:使用Fastjson转换格式

import com.alibaba.fastjson.JSON;

Person person1 = JSON.parseObject(str, Person.class);

方式五:使用Jackson转换格式

import com.fasterxml.jackson.databind.ObjectMapper;

ObjectMapper mapper = new ObjectMapper();
Person person1 = mapper.readValue(str, Person.class);

方式四、五相关连接地址

https://blog.csdn.net/lydms/article/details/108463165
目录
相关文章
|
24天前
|
安全 Java
Object取值转java对象
通过本文的介绍,我们了解了几种将 `Object`类型转换为Java对象的方法,包括强制类型转换、使用 `instanceof`检查类型和泛型方法等。此外,还探讨了在集合、反射和序列化等常见场景中的应用。掌握这些方法和技巧,有助于编写更健壮和类型安全的Java代码。
38 17
|
6月前
|
存储 安全 Java
【Java集合类面试二十五】、有哪些线程安全的List?
线程安全的List包括Vector、Collections.SynchronizedList和CopyOnWriteArrayList,其中CopyOnWriteArrayList通过复制底层数组实现写操作,提供了最优的线程安全性能。
|
6月前
|
Java
【Java集合类面试二十三】、List和Set有什么区别?
List和Set的主要区别在于List是一个有序且允许元素重复的集合,而Set是一个无序且元素不重复的集合。
|
6月前
|
存储 Java
Java学习笔记 List集合的定义、集合的遍历、迭代器的使用
Java学习笔记 List集合的定义、集合的遍历、迭代器的使用
101 4
|
6月前
|
Java 数据库连接 mybatis
成功解决:java.lang.Integer cannot be cast to java.lang.Long
这篇文章讨论了Java中常见的类型转换错误,包括Integer转Long、Integer转String以及在MyBatis中Map接收查询结果时的类型不匹配问题,并提供了相应的解决方法。
|
4月前
|
安全 Java 程序员
深入Java集合框架:解密List的Fail-Fast与Fail-Safe机制
本文介绍了 Java 中 List 的遍历和删除操作,重点讨论了快速失败(fail-fast)和安全失败(fail-safe)机制。通过普通 for 循环、迭代器和 foreach 循环的对比,详细解释了各种方法的优缺点及适用场景,特别是在多线程环境下的表现。最后推荐了适合高并发场景的 fail-safe 容器,如 CopyOnWriteArrayList 和 ConcurrentHashMap。
99 5
|
4月前
|
Java 程序员 编译器
Java|如何正确地在遍历 List 时删除元素
从源码分析如何正确地在遍历 List 时删除元素。为什么有的写法会导致异常,而另一些不会。
91 3
|
4月前
|
Java 程序员
Java|List.subList 踩坑小记
不应该仅凭印象和猜测,就开始使用一个方法,至少花一分钟认真读完它的官方注释文档。
49 1
|
6月前
|
Java 数据库
成功解决:java.sql.SQLSyntaxErrorException: Unknown column ‘origin_name‘ in ‘field list‘
这篇文章讲述了作者在使用SpringBoot和Mybatis-plus时遇到的一个数据库字段映射问题,即SQLSyntaxErrorException错误,原因是实体类字段和数据库字段不匹配。文章提供了两种解决方法:一是关闭自动驼峰命名转换配置,二是修改数据库字段以匹配实体类字段,最终成功解决了问题。
成功解决:java.sql.SQLSyntaxErrorException: Unknown column ‘origin_name‘ in ‘field list‘
|
6月前
|
前端开发 Java
成功解决:java.lang.String cannot be cast to java.lang.Integer
这篇文章记录了作者在使用Axios二次封装时遇到的一个Java类型转换问题,即前端传递的字符串参数不能直接转换为Integer类型,文章提供了正确的转换方法来解决这个问题。
成功解决:java.lang.String cannot be cast to java.lang.Integer

热门文章

最新文章