Tell me more ×
Stack Overflow is a question and answer site for professional and enthusiast programmers. It's 100% free, no registration required.

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!

share|improve this question
   
Object doesn't extends Comparable so it cannot be cast to V – RC. Aug 27 '12 at 6:28
1  
That's pretty much how it works. – Ted Hopp Aug 27 '12 at 6:28
1  
It seems to me that it has nothing to do with array in fact. Even you have a single object reference, it is the same. Because you have <V extends Comparable<V>>, after type erasure, V will be replaced by Comparable<V> (instead of Object), which caused the issue you faced – Adrian Shum Aug 27 '12 at 7:20
I agree Adrian. Just wanted to use the example I had at hand for explanation. – dh00608000 Aug 27 '12 at 7:35

1 Answer

The type variable is erased to the erasure of its left most bound. So V is erased to |Comparable<V>| = Comparable. If you changed the bound to Object & Comparable<V> the erasure would become |Object| = Object and (V[]) new Object[10] would work also.

share|improve this answer

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.