java 的泛型的类型擦除,除了 调用泛型方法 和 访问泛型字段 会 先擦除再强制转换 , 其他地方没有这种机制了吗 ?
比如下面这张图, 为什么 new T[2] 始终是 构造 Comparable[2] 数组, 就不会像上面一样再 增加一个 强制类型转换吗 ? 比如 这里的 T 的类型是 A (A 实现了 Comparable 接口),
T[ ] mm = new T[2]; 就应该是 先构造 Comparable[2] 数组,再强制转换为 A[ ] 呀 !
java 的泛型的类型擦除,除了 调用泛型方法 和 访问泛型字段 会 先擦除再强制转换 , 其他地方没有这种机制了吗 ?
比如下面这张图, 为什么 new T[2] 始终是 构造 Comparable[2] 数组, 就不会像上面一样再 增加一个 强制类型转换吗 ? 比如 这里的 T 的类型是 A (A 实现了 Comparable 接口),
T[ ] mm = new T[2]; 就应该是 先构造 Comparable[2] 数组,再强制转换为 A[ ] 呀 !
数组属于底层数据结构,从道理上来说也应该不支持这种不是那么正规的泛型。new T[2]
这种方式无法通过编译吧。List<T>
的方式通过object
转换,也是应用层的取巧方式,属于曲线救国。
4 回答1.5k 阅读✓ 已解决
4 回答1.3k 阅读✓ 已解决
2 回答2.9k 阅读✓ 已解决
1 回答2.6k 阅读✓ 已解决
2 回答762 阅读✓ 已解决
2 回答1.8k 阅读
2 回答1.7k 阅读
数组本身就是带有确切类型的,在编译时就已经确定了数组的类型。不能通过运行时的类型(泛型)来进行强制转换(ClassCastException)。如果想要将
T[]
数组(这里就是Comparable[]
)转为A[]
需要自己在声明泛型的地方new A[]
来声明数组类型,然后在将T中元素逐个强制转换为A类型。就好比ArrayList中的get方法,是将自己内部的Object[]
数组元素强转为泛型声明的类型。