Java:使用通用数组了解类型擦除

时间:2012-08-27 06:24:43

标签: java arrays generics generic-collections

我想知道我是否正确理解了以下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而导致转换异常。通过将其更改为可比较数组来解决它。

这是对的吗?谢谢!

1 个答案:

答案 0 :(得分:3)

将类型变量删除为其最左侧绑定的擦除。因此V被删除为|Comparable<V>| = Comparable。如果您将绑定更改为Object & Comparable<V>,则删除将变为|Object| = Object(V[]) new Object[10]也可以。

相关问题