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

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

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

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

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

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

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

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

List<String> list = new ArrayList<>();
list.add("aaa");

list.stream().map(a -> a.toString())
        .filter(a -> a != null)  // 此时 a 的类型为 String,可以进行非空判断

以上就是Java Stream 泛型未填写为何会导致类型擦除?的详细内容,更多请关注www.sxiaw.com其它相关文章!