构建java泛型数组的陷阱:new t[2] 返回什么?
本文深入探讨了Java泛类型的擦除机制,重点关注其在数组创建中的独特表现,并解释了为什么neww T[2] 总是回到Comparable[] 而不是A[]。许多开发者对泛型类型擦除的理解仅限于泛型方法和字段,但数组的处理方法不同。
问题是,虽然在编译过程中会擦除泛型方法和字段,然后强制转换类型,但数组并非如此。Java数组是协变的,但泛型参数不是。编译器将T[] Object[]擦除。Comparable[] 它是一种已知类型,不是在运行过程中确定的类型。因此,new T[2] Comparable[]直接创建,运行时Tomparable[] 实际类型无关。
即使T A类型,A类型 Comparable实现 接口,new T[2] Comparable仍然被创建。这不是因为没有类型擦除,而是因为编译时确定了数组类型。试着把Comparable[] 强制转换为A[] 将导致Clascascastexception。
A[]获得A[] new必须直接使用类型的数组 A[2] 与ArrayListt一起创建。 的get 方法不同,ArrayList Object[]内部使用 存储元素,但在获取元素时转换类型。然而,数组本身在编译过程中缺乏类型检查和转换机制。因此,在使用数组之前,需要手动处理类型转换,如comparable[] 数组中的元素逐一强制转换为A 类型。
立即学习“Java免费学习笔记(深入);
以上是Java泛型数组的创建:为什么neww T[2]总是返回Comparable[]而不是A[]?详情请关注图灵教育的其他相关文章!
