我想知道我是否正确理解了以下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];
替换,然后由于Object不会扩展Comparable而导致转换异常。通过将其更改为可比较数组来解决它。
这是对的吗?谢谢!
答案 0 :(得分:3)
将类型变量删除为其最左侧绑定的擦除。因此V
被删除为|Comparable<V>| = Comparable
。如果您将绑定更改为Object & Comparable<V>
,则删除将变为|Object| = Object
,(V[]) new Object[10]
也可以。