提前道歉,我正在努力解决问题标题,我知道这不太理想。
所以我尝试实现我自己的Java HashMap的小版本,当然我希望它适用于泛型,以允许它与任何类一起工作,就像真正的HashMap一样。
在我的get(...)
方法中,我传递一个键并希望返回一个值。一切正常,直到我尝试返回一些东西,然后我得到常见问题的Xlint:unchecked
类型安全警告,我的返回值类型无法验证。请参阅以下代码段:
public <K, V> V get (K key) {
if(!(key instanceof Object)) {
System.out.println("ERROR: key given can't be guaranteed to have a hash function");
return null;
}
int hashCode = key.hashCode();
int index = hashCode % items.length;
HashItem slot = items[index];
while(slot != null) {
if(slot.getKey().equals(key)) {
V val = slot.getVal();
return val;
}
slot = slot.getNext();
}
return null;
}
供参考,请参阅.getVal()
:
public V getVal() {
return HashItem.this.val;
}
.getVal()
方法是私有内部类HashItem<K, V>
的一部分:
private class HashItem <K, V> {
// blah blah
}
自制的哈希地图类本身的结构如下:
public class MyHash <K, V>
{
// blah blah
private class HashItem <K, V> {
// blah blah
public V getVal() {
return HashItem.this.val;
}
// blah blah
}
public MyHash (int capacity, double newLoadFactor) {
// blah blah
}
// blah blah etc etc
}
由于K
和V
始终保持不变,因此我不明白为什么.getVal()
的类型无法保证,或者如何解决此问题。我尝试像这样进行投射:(V)
有效,但返回未经检查的强制转换错误。我也试过返回值,但后来我得到了返回类型Object
这是不可接受的。
如何让我的.getVal()
方法返回正确的类型?
答案 0 :(得分:0)
1.将public <K, V> V get(K key)
更改为public V get(K key)
2.将HashItem slot = items[index];
更改为HashItem<K, V> slot = items[index];
示例代码:
public class MyHash<K, V> {
// blah blah
private class HashItem<K, V> {
// blah blah
V val;
K key;
public V getVal() {
return HashItem.this.val;
}
public K getKey() {
return HashItem.this.key;
}
public HashItem<K, V> getNext() {
return null;
}
// blah blah
}
HashItem<K, V>[] items;
public V get(K key) {
if (!(key instanceof Object)) {
System.out.println("ERROR: key given can't be guaranteed to have a hash function");
return null;
}
int hashCode = key.hashCode();
int index = hashCode % items.length;
HashItem<K, V> slot = items[index];
while (slot != null) {
if (slot.getKey().equals(key)) {
V val = slot.getVal();
return val;
}
slot = slot.getNext();
}
return null;
}
}