当前位置: 首页 > 工具软件 > eC-lang > 使用案例 >

[问题]:“[Ljava.lang.Object; cannot be cast to [Ljava.lang.Long;“

宰鸿博
2023-12-01

通过stream流的形式从数据库中查出一个集合:
List<Long> modeId = scpRoleModMapper.selectScpRoleModByIdList(authConfigRequesBean.getRoleId())
                .stream()
                .filter(Objects::nonNull)
                .map(scpRoleMod -> scpRoleMod.getModelId())
                .collect(Collectors.toList());

将集合转换成数组的形式:

(1)、Long [] ids = (Long [])modeId.toArray();

(2)、Long[] ids= new Long[modeId.size()];

        modeId = modeIdList.stream().toArray(modeId);

使用以上两种方式将list转换为Long[]数组时候产生:[Ljava.lang.对象;无法转换为[Ljava.lang.Long;的异常,是因为.toArray()转换数组是Object[],相当于初始化数组就是Object[]类型,Object[]数组通过强转是无法转换为其他类型的数组(注意),但是一开始初始化数组为基本数据类型或者包装类,先转换为object[]数组,可以通过强转的形式将Object[]数组转换为初始化类型的数组。

原因:主要是底层源码 的原因,想要了解可以链接了解一下:(8条消息) Java数组 强制类型转换_划水大圣的博客-CSDN博客_java数组强制类型转换

 

解决方法:

1、笨方法:循环转数组


        int size = modeId.size();
        Long[] ids = new Long[size];
        for (int i = 0; i < size; i++) {
            ids[i] = modeId.get(i);
        }

2、经过查阅资料和博客和自己测试推荐的方法(通过stream流的形式解决)

Long[] ids = modeId.stream().toArray(Long[]::new);

以上两种方式均可以使用,但是推荐第二种,希望可帮助到大家!!!

 类似资料: