You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 03:56:18