JUnit测试中TreeMap批量转换数组为LinkedList的类型问题
解决JUnit测试中TreeMap存入LinkedList的强转问题
问题根源
Arrays.asList()返回的是Arrays类内部实现的固定大小List子类,它既不是java.util.ArrayList,也和LinkedList无继承关系,直接强转会抛出ClassCastException。
方法1:通过LinkedList构造器直接转换
利用LinkedList构造器可接收任意Collection的特性,把Arrays.asList()的结果传入生成LinkedList实例:
Map<Integer, LinkedList<String>> expected = new TreeMap<>(); // 示例写法 expected.put(1, new LinkedList<>(Arrays.asList( "18_2_2_3_java.lang.String_", "27_0_0_93_java.sql.Timestamp_", // 其他元素... ))); expected.put(2, new LinkedList<>(Arrays.asList( "2_6_6_12_java.lang.String_", "-1_6_6_2005_java.lang.String_", // 其他元素... )));
方法2:简化Map的泛型定义(推荐)
JUnit断言集合相等时,仅比较元素内容和顺序,不校验具体实现类。可将Map泛型放宽为List<String>,避免不必要的类型限定:
// 修改泛型为List<String>,兼容所有List实现 Map<Integer, List<String>> expected = new TreeMap<>(); // 直接存入Arrays.asList的结果,无需转换 expected.put(1, Arrays.asList( "18_2_2_3_java.lang.String_", "27_0_0_93_java.sql.Timestamp_", // 其他元素... ));
这种写法更简洁,符合面向接口编程原则,且不影响测试断言准确性。
方法3:使用Stream API转换(Java 8+)
若需对列表元素做额外操作(如过滤、映射),可结合Stream API生成LinkedList:
import java.util.stream.Collectors; // 示例:先过滤再生成LinkedList expected.put(1, Arrays.asList("...", "...") .stream() .filter(s -> !s.isEmpty()) // 示例过滤操作 .collect(Collectors.toCollection(LinkedList::new)));
内容的提问来源于stack exchange,提问作者th0sf4n
相关产品推荐
相关产品推荐

