将Enum数组转换为含Enum#name()返回值的String数组时遇ArrayStoreException如何解决?
解决Enum数组转String数组的ArrayStoreException问题
这个问题我之前处理过好几次,其实你踩的坑很典型——你直接把枚举实例的列表往字符串数组里转,类型不匹配当然会报错啦!
为什么你的代码会报错?
你写的Arrays.asList(Column.values())得到的是一个包含Column枚举对象的List<Column>,而不是字符串列表。当你调用toArray(String[]::new)时,Java尝试把Column类型的对象存入String类型的数组,这违反了数组的类型安全规则,所以直接抛出ArrayStoreException。
正确的解决方案
这里给你两种常用的解决方式,根据你的Java版本选择:
1. Java 8及以上(推荐用Stream API)
用Stream来把每个枚举实例映射成它的name()字符串,再转成数组,代码简洁又优雅:
String[] stringArray = Arrays.stream(Column.values()) .map(Column::name) .toArray(String[]::new);
Arrays.stream(Column.values()):把枚举数组转换成Stream流.map(Column::name):将每个Column实例映射为它的名称字符串(调用Enum#name()方法).toArray(String[]::new):将流中的字符串收集成String数组
2. Java 8之前的版本(传统循环方式)
如果你的项目还在使用Java 8之前的版本,用普通循环也能轻松解决:
Column[] columnArray = Column.values(); String[] stringArray = new String[columnArray.length]; for (int i = 0; i < columnArray.length; i++) { stringArray[i] = columnArray[i].name(); }
先创建对应长度的String数组,再逐个把枚举的名称赋值进去,兼容性拉满。
额外小提示
如果你想使用枚举的toString()方法而不是name(),只需要把Column::name换成Column::toString就行。注意:name()返回的是枚举定义时的常量名(不可修改),而toString()可以被重写,根据你的业务需求选择就好。
内容的提问来源于stack exchange,提问作者dennisp
相关产品推荐
相关产品推荐

