简体   繁体   中英

Java: Understanding Type Erasure with Generic Arrays

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!

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM