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

Java 17中该代码为何未触发类型不匹配异常?

为什么强制转换List<List>为List未触发类型异常?

先看问题中的代码:

import java.util.List;

class Scratch {
    public static void main(String[] args) {

        List<String> test = (List<String>) getLists();
        System.out.print(test);

    }

    private static Object getLists() {
        return List.of(List.of("123", "456"));
    }
}

核心原因:Java泛型的类型擦除机制

Java的泛型是编译期语法糖,编译完成后所有泛型参数都会被擦除。运行时,List<String>和List<List<String>>的实际类型都是List,JVM无法区分这两个泛型类型的差异。

所以当你把getLists()返回的Object(实际是List<List<String>>)强制转换为List<String>时,JVM只会检查该对象是不是List类型——显然是的,因此不会抛出ClassCastException。

为什么输出正常?

System.out.print(test)调用的是List的toString()方法,这个方法只关心集合里实际存储的元素是什么,不管泛型声明的参数类型。实际元素是List<String>,所以toString()会正常输出嵌套列表的格式[[123, 456]]。

但如果尝试将test中的元素当作String来使用,比如添加一行:

String s = test.get(0);

这时候运行时就会抛出ClassCastException,因为实际取出的是List<String>对象,无法转换为String。

编译期的提示

其实编译这段代码时,编译器会给出unchecked cast的警告,提示你这个强制转换是不安全的——编译器能静态感知到泛型类型不匹配,但因为转换的源头是Object,无法做严格的类型检查,所以只能通过警告提醒开发者。

内容的提问来源于stack exchange,提问作者Ralf

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 16:50:57