0

この質問は、Javafor-eachループの要素がどのように扱われるかに関するものです。LinkedListsの配列であるhashTableがあります。LinkedListノードのデータ部分にはが含まれますTableEntry<K,V>。ここで、KとVはキーと値のタイプです。

LinkedListの各TableEntryを調べて、キーがTableEntryキーと等しいかどうかを確認するforループを作成しました。構文はちょっと醜いので、for-eachループの方がエレガントでシンプルだと思いました。

確かに、書く方が簡単でした。しかし、IDEを終了すると、element.getValue()はV型ではなくObject型であると文句を言いました。ステートメントの前にV型キャストを配置すると、文句はなくなります。私はまだこのコードをテストしていませんが、最初にこれは許容できる方法ですか?次に、タイプVのメソッドがあるのに、要素がタイプObjectになるのはなぜですか?

@Override
public V getValue(K key)
{
    int index = getHashIndex(key);
    if(hashTable[index] != null)
    {

        //Standard for loop
        for(int i = 0; hashTable[index].get(i) != null; i++)
        {
            if(hashTable[index].get(i).getKey().equals(key))
            {
                return hashTable[index].get(i).getValue();
            }
        }

        //For-each loop should do same thing?
        for(TableEntry element : hashTable[index])
        {
            if(element.getKey().equals(key))
            {
                return (V) element.getValue();
            }
        }
    }
    return null;
}
4

1 に答える 1

4

拡張forループのジェネリックパラメーターを省略しました。したがって、TableEntry基本的にデフォルトはTableEntry<Object, Object>(IDEはこの一般化されていない使用を強調表示し、コンパイラはそれを警告します。必要なパラメータを含めるために拡張を変更してみてください:

for(TableEntry<K, V> element : hashTable[index]) {
    if(element.getKey().equals(key)) {
        return element.getValue();
    }
}

'standard'ループが機能する理由については、ハッシュテーブルをジェネリックパラメーターで宣言する必要があるため、コンパイラーはアクセスしようとしているタイプを認識します。

于 2013-02-21T02:08:53.313 に答える