簡體   English   中英

泛型與數組

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM