知识卡片
擦除限制泛型
内容
Java泛型通过擦除实现,编译后类型参数会丢失,因此不能直接 new T()、new T[] 或 instanceof T。发散:泛型提升编译期表达力,但运行期能力仍受语言实现策略约束。
参考来源
- 位置:《你真的会写代码吗-2021》第9章《请重复利用:可复用性》"泛型擦除"专栏(源文件:_epub-src/OEBPS/Text/0019.xhtml)
- 结论依据:原文明确"在Java中,泛型是通过擦除(erasure)来实现的,这意味着编译器使用类型参数来执行更有表现力的类型检查,然后把它们扔掉。类型参数不包含在字节码中,JVM也不支持它们",并直接举例"不能用new T()来实例化一个类型参数,也不能用exp instanceof T来比较"。
- 原始内容:在Java中,泛型是通过擦除(erasure)来实现的,这意味着编译器使用类型参数来执行更有表现力的类型检查,然后把它们扔掉。类型参数不包含在字节码中,JVM也不支持它们。这种实现策略限制了泛型的能力。例如,你不能用new T()来实例化一个类型参数,也不能用exp instanceof T来比较一个表达式的运行时类型和一个类型参数。