2014-11-17 44 views
1

通用數組的問題(即它們的不可能性)似乎是我反覆出現的主題。以下是HashMap數據結構的相關代碼。顯然,我不能聲明Bucket[],因爲泛型數組是不可能的。不過,我可以申報MapThing.Bucket[]。當我斷言這是一種好的做法時,我是否正確,因爲儘管MapThing.Bucket[]是原始類型聲明,但實際的MapThing.Bucket[]實例是通過其封閉實例進行類型參數化的嗎?這個通用數組是合法的嗎?

感謝您的任何見解!

克里斯

public class MapThing<K, V> { 
    private Bucket buckets[]; 

    public static void main(String[] argv) { 
    MapThing<String, Integer> thing = new MapThing<>(); 
    thing.put("got your number", 8675309); 
    } 

    @SuppressWarnings("unchecked") 
    public MapThing() { 
    buckets = new MapThing.Bucket[314159]; 
    } 

    public void put(K key, V value) { 
    Bucket bucket = new Bucket(key, value); 

    // Prints typeof bucket key: String, value: Integer 
    System.out.println("typeof bucket key: " 
    + bucket.getKey().getClass().getSimpleName() + ", value: " 
    + bucket.getValue().getClass().getSimpleName()); 

    buckets[Math.abs(key.hashCode() % buckets.length)] = bucket; 
    } 

    private class Bucket { 
    private K key; 
    private V value; 

    Bucket(K key, V value) { 
     this.key = key; 
     this.value = value; 
    } 

    public K getKey() { 
     return key; 
    } 

    public V getValue() { 
     return value; 
    } 
    } 
} 
+1

你當然可以聲明一個'Bucket'數組,你爲什麼認爲你不能?你正在使用原始類型,你不應該那樣做。 –

+1

實際數組知道關於泛型的_nothing_。 –

+0

不,我不能聲明一個Bucket數組: Bucket [] bucket = new Bucket [12]; //給出以下錯誤: 「無法創建MapThing的通用數組 .Bucket」 – orb

回答

1

Obviously, I cannot declare a Bucket[], since generic arrays are impossible.

  1. 你總是可以申報任何陣列類型的變量。總是。聲明變量Bucket[]ArrayList<String>[]或其他什麼是完全正確的。

  2. 不能與參數化類型使用數組創建表達式(即new X[...])(即,如果XSomething<SomethingElse>其中SomethingElse是任何東西,除了?)。您可以使用可以使用具有原始類型的數組創建表達式(即,new X[...],其中X是原始類型),例如, new ArrayList[10]

    因此,如果Bucket是原始類型,那麼new Bucket[10]將會非常好。事情是,Bucket不是原始類型。 Bucket是通用外部類中的非靜態內部類。這意味着它在其外部類的類型參數範圍內。換句話說,如果您在MapThing之內寫入不合格類型Bucket,則它隱含地表示MapThing<K,V>.Bucket,這是參數化的類型。

    要獲得原始類型,您需要明確地使用外部類進行限定,如MapThing.Bucket。所以new MapThing.Bucket[10]將工作。或者,如果您不想使用原始類型,則可以使用所有通配符對它進行參數化:new MapThing<?,?>.Bucket[10]

相關問題