未经检查的泛型类型方法的转换返回Java

时间:2015-11-18 02:43:13

标签: java generics

提前道歉,我正在努力解决问题标题,我知道这不太理想。

所以我尝试实现我自己的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
}

由于KV始终保持不变,因此我不明白为什么.getVal()的类型无法保证,或者如何解决此问题。我尝试像这样进行投射:(V)有效,但返回未经检查的强制转换错误。我也试过返回值,但后来我得到了返回类型Object这是不可接受的。

如何让我的.getVal()方法返回正确的类型?

1 个答案:

答案 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;
    }

}