0

我想知道我是否正确理解了以下 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];then 它可以工作。

我理解它的方式是,编译后生成的字节码将没有任何通用引用,因为它们被 Java 的类型擦除所取代。

this.array = (V[]) new Object[10];中断,因为该行将被隐式替换,this.array = (Comparable[]) new Object[10];然后将导致强制转换异常,因为 Object 不扩展 Comparable。它通过将其更改为 Comparables 数组来解决。

这个对吗?谢谢!

4

1 回答 1

3

类型变量被擦除到其最左边界的擦除。所以V被抹去|Comparable<V>| = Comparable。如果您将绑定更改Object & Comparable<V>为擦除将成为|Object| = Object并且(V[]) new Object[10]也将起作用。

于 2012-08-27T08:45:11.973 回答