Java泛型数组创建:为什么new T[2]总是返回Comparable[]而不是A[]?

Java泛型数组创建的陷阱:new t[2] 究竟返回什么?

本文深入探讨Java泛型类型擦除机制,重点关注其在数组创建中的独特表现,并解释为什么new T[2] 总是返回Comparable[] 而不是A[]。许多开发者对泛型类型擦除的理解仅限于泛型方法和字段,但数组的处理方式有所不同。

Java泛型数组创建:为什么new T[2]总是返回Comparable[]而不是A[]?

问题在于:虽然泛型方法和字段在编译时会进行类型擦除,随后进行强制类型转换,但数组却并非如此。Java数组是协变的,但泛型类型参数不是。编译器将T[] 擦除为Object[]。Comparable[] 是一个已知类型,并非运行时确定的类型。因此,new T[2] 直接创建的是Comparable[],与运行时T 的实际类型无关。

即使T 的类型为A,且A 实现了Comparable 接口,new T[2] 创建的仍然是Comparable[]。这并非因为没有类型擦除,而是因为数组类型在编译时就已确定。试图将Comparable[] 强制转换为A[] 将导致ClassCastException。

要获得A[] 类型的数组,必须直接使用new A[2] 创建。这与ArrayList 的get 方法不同,ArrayList 内部使用Object[] 存储元素,但在获取元素时会进行类型转换。但数组本身缺乏这种运行时类型检查和转换机制,其类型在编译时已固定。因此,在使用数组前,需要手动处理类型转换,例如将Comparable[] 数组中的元素逐个强制转换为A 类型。

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

以上就是Java泛型数组创建:

© 版权声明
THE END
喜欢就支持一下吧
点赞6 分享