2015-10-23 9 views
7

Hashtable#getです:なぜHashtableは内部的にエントリ<?,?>を使用しますか?ここ

@SuppressWarnings("unchecked") 
public synchronized V get(Object key) { 
    Entry<?,?> tab[] = table; 
    int hash = key.hashCode(); 
    int index = (hash & 0x7FFFFFFF) % tab.length; 
    for (Entry<?,?> e = tab[index] ; e != null ; e = e.next) { 
     if ((e.hash == hash) && e.key.equals(key)) { 
      return (V)e.value; 
     } 
    } 
    return null; 
} 

なぜそれがEntry<?,?>代わりのEntry<K,V>を使用していますか?

+0

私が持っているソースコード(1.8)は、インスタンス変数 'table'があまりにもワイルドカードであることを述べています。 – rgettman

答えて

1

Hashtableの作成は、Java 1.5でジェネリックで行われたすべての作業の前に行われます。そのため、ジェネリックが改造された可能性が高いシナリオです。

tableが配列であり、ジェネリックと配列がうまくいっていないことが原因である可能性があります。 が入力した

Hashtable内のフィールド)table場合は、...これらの宣言の多くに対処する

// Generic array creation! 
Entry<K, V>[] newMap = new Entry<K, V>[newCapacity]; 

を持っているだろう...、おそらく設計/実装上の決断でしたジェネリック医薬品の完全な包み込みとは対照的に、互換性のために努力しています。

。また、ワイルドカードを持つ配列型を作成することにより、実際に、具体的なタイプ意志で配列を作成するのに対し、コンパイル時エラーを起こさないことに注意して結合していないワイルドカードis considered reifiableとジェネリック型:

List<?>[] foo = new ArrayList[10]; // perfectly legal but not encouraged 
List<String> bar = new ArrayList[10]; // not legal 

今後大会は、この特定の実装は同期され、まだそれに予め1.5規則の多くを使用している両方いるので、代わりにHashMapを使用することです。 `;`民間過渡エントリ []テーブル - (。あなたが同期したい場合は、さえドキュメントはConcurrentHashMapをお勧めします)

関連する問題

 関連する問題