什么是Java做什么 - 每个元素使它们成为类型对象?

时间:2013-02-21 02:03:39

标签: java foreach hashtable

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

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

确实写起来更简单。但是,当我完成我的IDE时,抱怨element.getValue()的类型为Object,而不是类型V.我在语句前面向V添加了一个类型转换,它停止了抱怨。我还没有测试过这段代码,但我想知道,首先这是一种可以接受的做法吗?第二个为什么元素最终成为Object类型,即使它们有类型V的方法?

@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;
}

1 个答案:

答案 0 :(得分:4)

您在增强的for循环中省略了通用参数。因此,您的TableEntry基本上默认为TableEntry<Object, Object>(IDE会突出显示此非泛化使用,编译器会对此进行警告。尝试更改您的增强版,以包含必要的参数:

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

至于为什么你的'标准'循环工作,你的哈希表必须用泛型参数声明,所以编译器知道你试图访问的类型。