这个问题涉及如何处理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;
}
答案 0 :(得分:4)
您在增强的for循环中省略了通用参数。因此,您的TableEntry
基本上默认为TableEntry<Object, Object>
(IDE会突出显示此非泛化使用,编译器会对此进行警告。尝试更改您的增强版,以包含必要的参数:
for(TableEntry<K, V> element : hashTable[index]) {
if(element.getKey().equals(key)) {
return element.getValue();
}
}
至于为什么你的'标准'循环工作,你的哈希表必须用泛型参数声明,所以编译器知道你试图访问的类型。