0

这个问题是关于如何处理 Java for-each 循环中的元素。我有一个 hashTable,它是一个 LinkedLists 数组。LinkedList 节点的数据部分包含TableEntry<K,V>,其中 K 和 V 是键和值类型。

我编写了一个 for 循环来查看 LinkedList 中的每个 TableEntry,检查一个键是否等于 TableEntry 键。语法有点难看,所以我想也许 for-each 循环会更优雅/简单。

确实写起来更简单。但是,当我完成我的 IDE 时抱怨 element.getValue() 是 Object 类型,而不是 V 类型。我在语句前面放了一个类型转换为 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 将突出显示这种未泛化的使用,并且编译器会警告它。尝试更改您的 enhanced-for 以包含必要的参数:

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

至于为什么您的“标准”循环有效,您的哈希表必须使用泛型参数声明,以便编译器知道您尝试访问的类型。

于 2013-02-21T02:08:53.313 回答