《Java 核心技术 卷一》 关于 泛型的 类型擦除 ,除了 调用泛型方法 和 访问泛型字段 会 先擦除再强制转换, 其他地方没有这种机制了吗 ?

java 的泛型的类型擦除,除了 调用泛型方法访问泛型字段先擦除再强制转换 , 其他地方没有这种机制了吗 ?

比如下面这张图, 为什么 new T[2] 始终是 构造 Comparable[2] 数组, 就不会像上面一样再 增加一个 强制类型转换吗 ? 比如 这里的 T 的类型是 A (A 实现了 Comparable 接口),
T[ ] mm = new T[2]; 就应该是 先构造 Comparable[2] 数组,再强制转换为 A[ ] 呀 !


回答:

数组本身就是带有确切类型的,在编译时就已经确定了数组的类型。不能通过运行时的类型(泛型)来进行强制转换(ClassCastException)。如果想要将T[]数组(这里就是Comparable[])转为A[]需要自己在声明泛型的地方new A[]来声明数组类型,然后在将T中元素逐个强制转换为A类型。就好比ArrayList中的get方法,是将自己内部的Object[]数组元素强转为泛型声明的类型。


回答:

数组属于底层数据结构,从道理上来说也应该不支持这种不是那么正规的泛型。new T[2] 这种方式无法通过编译吧。List<T>的方式通过object转换,也是应用层的取巧方式,属于曲线救国。


回答:

你的另外一个问题的回答
见这个问题的回答。

以上是 《Java 核心技术 卷一》 关于 泛型的 类型擦除 ,除了 调用泛型方法 和 访问泛型字段 会 先擦除再强制转换, 其他地方没有这种机制了吗 ? 的全部内容, 来源链接: utcz.com/p/944970.html

回到顶部