[英]Java: Understanding Type Erasure with Generic Arrays
我想知道我是否正确理解以下Java问题。 给定一个通用集合,如果我这样做
public class HashTable<V extends Comparable<V>> implements HashTableInterface<V> {
private V[] array;
public HashTable() {
this.array = (V[]) new Object[10];
}
}
代码中断,并引发异常:java.lang.ClassCastException: [Ljava.lang.Object; 无法转换为[Ljava.lang.Comparable;
但是,如果我更改this.array = (V[]) new Object[10];
到this.array = (V[]) new Comparable[10];
然后就可以了。
我的理解是,编译后生成的字节码将没有任何泛型引用,因为它们已被Java的类型擦除所取代。
this.array = (V[]) new Object[10];
中断,因为该行将被this.array = (Comparable[]) new Object[10];
隐式替换this.array = (Comparable[]) new Object[10];
这将导致强制转换异常,因为Object不扩展Comparable。 通过将其更改为可比较数组来解决。
这个对吗? 谢谢!
擦除类型变量以消除其最左边界 。 因此, V
被擦除为|Comparable<V>| = Comparable
|Comparable<V>| = Comparable
。 如果将边界更改为Object & Comparable<V>
则擦除将变为|Object| = Object
|Object| = Object
和(V[]) new Object[10]
也将起作用。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.