Java Stream 泛型未填写为何会导致类型擦除?

ID:17101 / 打印

java stream 泛型未填写为何会导致类型擦除?

java stream 泛型未填写导致类型擦除的深层原因

在java 中,如果一个集合未指定泛型,则编译器会将其视为object 类型集合。这意味着集合可以容纳任何类型的对象,包括 string、integer 等。

当对这种未指定泛型集合应用 stream 流操作时,流的中介操作(如 map、filter)会对每个元素进行类型擦除。这意味着这些操作将把元素视为 object 类型对象,即使在原始集合中它们是特定类型(如 string)。

这会导致 downstream 的操作无法准确识别元素的类型。例如,在过滤操作中,无法判断元素是否为 string 类型,因为编译器已经将元素类型擦除了。

立即学习“Java免费学习笔记(深入)”;

这种现象的深层原因在于 java 是一种编译型语言,在运行时没有泛型概念。编译器将泛型信息作为类型检查工具,而在运行时将泛型类型擦除为 object 类型。因此,编译器无法在运行时强制执行泛型约束,从而导致类型擦除。

为了防止类型擦除并确保流操作能够正确执行,必须为集合显式指定泛型类型。例如:

List<String> list = new ArrayList<>(); list.add("aaa");  list.stream().map(a -> a.toString())         .filter(a -> a != null)  // 此时 a 的类型为 String,可以进行非空判断
上一篇: Java Stream 操作中,泛型为何必不可少?
下一篇: 为什么从 Spring 上下文获取的 Bean 反射后拿不到属性?

作者:admin @ 24资源网   2024-11-27

本站所有软件、源码、文章均有网友提供,如有侵权联系308410122@qq.com

与本文相关文章

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。