这是Hashtable#get
:
@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)
Hashtable
的创建早于Java 1.5中使用泛型所做的任何工作,所以这里可能出现的情况是仿制药被改造了。
虽然更大的说法可能是因为table
是一个数组,但是泛型和数组不能很好地相处。
如果输入table
(Hashtable
)中的字段,则您必须处理很多这些声明......
// 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
未来的惯例将是使用HashMap
,因为这个特定的实现是同步的,并且仍然使用了许多1.5之前的约定。 (如果您想要同步,甚至文档也会推荐ConcurrentHashMap
。)