I was wondering whether I understand the following Java issue correctly. Given a generic collection, if I do
public class HashTable<V extends Comparable<V>> implements HashTableInterface<V> {
private V[] array;
public HashTable() {
this.array = (V[]) new Object[10];
}
}
the code breaks, throwing an exception: java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to [Ljava.lang.Comparable;
However, if I change this.array = (V[]) new Object[10];
to this.array = (V[]) new Comparable[10];
then it works.
The way I understand it is that upon compilation the resulting bytecode will not have any generic references as they are replaced by Java's type erasure.
this.array = (V[]) new Object[10];
breaks because the line will implicitly be replaced by this.array = (Comparable[]) new Object[10];
which will then result in a cast exception as Object does not extend Comparable. It is resolved by changing it to an array of Comparables.
Is this correct? Thanks!
Object
doesn't extendsComparable
so it cannot be cast toV
– RC. Aug 27 '12 at 6:28