Jasper调用Arrays.asList用变量报ClassCastException,变量类型如何设置?
解决ClassCastException:正确设置变量类型实现contains判断
问题根源
你遇到的ClassCastException是因为对Arrays.asList()的参数处理逻辑理解有误:
- 原代码中
$P{names}.trim().split("\\s*,\\s*")返回的是String[]数组,直接传给Arrays.asList()时,方法会将数组的每个元素作为列表项,生成List<String>。 - 当你把这个数组存入变量后再调用
Arrays.asList($V{namesArray}),如果变量类型是String[],Arrays.asList()会把整个数组对象当作单个元素,生成List<String[]>;如果强行将变量设为String/Collection/ArrayList,会触发数组到这些类型的强制转换错误。
正确解决方案
- 设置变量类型:将
$V{namesArray}的类型设为java.util.List<String> - 变量赋值:直接将
Arrays.asList()的结果赋值给变量,表达式写为:Arrays.asList($P{names}.trim().split("\\s*,\\s*")) - 调用contains:直接使用变量判断,无需再嵌套
Arrays.asList():$V{namesArray}.contains($F{name})
补充说明
如果一定要将数组存入变量再转列表(不推荐),可以手动将数组元素转成列表:
java.util.Arrays.stream($V{namesArray}).collect(java.util.stream.Collectors.toList())
此时变量$V{namesArray}的类型设为java.lang.String[],但这种写法不如直接将列表存入变量简洁高效。
内容的提问来源于stack exchange,提问作者Petar Yakov
相关产品推荐
相关产品推荐

