[英]Java: Understanding Type Erasure with Generic Arrays
我想知道我是否正確理解以下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];
隱式替換this.array = (Comparable[]) new Object[10];
這將導致強制轉換異常,因為Object不擴展Comparable。 通過將其更改為可比較數組來解決。
這個對嗎? 謝謝!
擦除類型變量以消除其最左邊界 。 因此, V
被擦除為|Comparable<V>| = Comparable
|Comparable<V>| = Comparable
。 如果將邊界更改為Object & Comparable<V>
則擦除將變為|Object| = Object
|Object| = Object
和(V[]) new Object[10]
也將起作用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.