[英]Generics vs. Arrays
我在許多答案(例如this )中看到,使用泛型創建數組的方法如下:
T[] array = (T[]) new Object[SIZE];
我正在嘗試做類似的事情:
EntryRecipient<K,V>[] array = (EntryRecipient<K,V>[]) new Object[MAX_SIZE];
但是,這不起作用,導致以下錯誤:
Exception in thread "main" java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to [LHashTable$EntryRecipient;
我的代碼是:
HashTableEntry (作為HashTable的私有子類包含)
class HashTableEntry<K,V> {
private K key;
private V value;
public HashTableEntry(K key, V value) {
this.key = key;
this.value = value;
}
public V value() {
return value;
}
public K key() {
return key;
}
}
EntryRecipient (包含在HashTable的私有子類中)
private class EntryRecipient<K,V> {
private List<HashTableEntry<K,V>> entries;
public EntryRecipient() {
entries = new ArrayList<HashTableEntry<K,V>>();
}
// ... other methods
}
哈希表
class HashTable<K,V> {
private EntryRecipient<K,V>[] map;
private final int MAX_SIZE = 199; // Prime, to avoid collisions
private int size;
public HashTable() {
map = (EntryRecipient<K,V>[]) new Object[MAX_SIZE];
size = 0;
}
// ... other methods
}
您能給我一些解決辦法的提示嗎?
我找不到在此代碼EntryRecipient<K,V>[]
Object[]
用於EntryRecipient<K,V>[]
任何原因。 數組的引用不是泛型引用,因此請使用該類類型的數組。 在Java中無法將Object數組直接轉換為EntryRecipient
數組。 ( EntryRecipient[]
與T[]
)。 解決該問題的方法是修改HashTable
構造函數,如下所示:
public HashTable() {
// Create an array of EntryRecipient
map = new EntryRecipient[MAX_SIZE];
size = 0;
// Initialize the array
// Otherwise you will get NullPointerException
for (int i = 0; i < MAX_SIZE; i++) {
map[i] = new EntryRecipient<K, V>();
}
}
首先問自己:'我真的需要一個數組嗎? 我可以只使用ArrayList<EntryRecipient<K, V>>
嗎? 數組列表是數組上非常薄的包裝。 您的代碼必須對性能非常敏感,才能看到任何不同的速度。 而所有這些通用類型的東西都可以使用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.