参数化对象无法解析为变量

Parametrized object cannot be resolved to variable

我有这段代码:

    @SuppressWarnings("unchecked")
    public void put(K key,V value){
        if(this.containsKey(key)){
            TableEntry<K,V> foundKey = (TableEntry<K,V>)this.getTableEntry(key);
            foundKey.setValue(value);
        } else{
            int slotNumber = Math.abs(key.hashCode()) % size;
            TableEntry<K,V> candidate = (TableEntry<K,V>) elements [slotNumber];
        }

        // empty slot
        if(candidate == null){
            elements[slotNumber] = new TableEntry(key,value,null);
        }else{
            while(candidate != null){
                candidate = candidate.next;
            }
            candidate.next = new TableEntry(key,value,null);
        }
    }

变量 candidateslotNumber 在 Eclipse 中带有下划线,TableEntry() 构造函数的调用也是如此。你能告诉我为什么我不能比较例如 candidate 和 null 吗?

如果你需要,这里是完整的class (Hash table):

package hr.fer.oop.lab3.prob2;

public class SimpleHashtable<K,V> {

    private V[] elements;
    private static int defaultsize = 16;
    private int size;

    public SimpleHashtable(){
        this(defaultsize);
    }

    @SuppressWarnings("unchecked")
    public SimpleHashtable(int initialCapacity){
        if(initialCapacity < 1) {
            throw new IllegalArgumentException("Capacity must be at least 1.");
        }
        elements = (V[])new Object[calculateCapacity(initialCapacity)];
    }

    public int calculateCapacity(int number){
        int result = 2;
        while(result < number){
            result = result << 1;
        }
        System.out.println(result);
        return result;
    }

    @SuppressWarnings("unchecked")
    public void put(K key,V value){
        if(this.containsKey(key)){
            TableEntry<K,V> foundKey = (TableEntry<K,V>)this.getTableEntry(key);
            foundKey.setValue(value);
        } else{
            int slotNumber = Math.abs(key.hashCode()) % size;
            TableEntry<K,V> candidate = (TableEntry<K,V>) elements [slotNumber];
        }

        // empty slot
        if(candidate == null){
            elements[slotNumber] = new TableEntry(key,value,null);
        }else{
            while(candidate != null){
                candidate = candidate.next;
            }
            candidate.next = new TableEntry(key,value,null);
        }
    }

    @SuppressWarnings("unchecked")
    private TableEntry<K,V> getTableEntry(K key) {
        int slotNumber = Math.abs(key.hashCode()) % this.size;
        TableEntry<K,V> candidate = (TableEntry<K,V>) elements [slotNumber];

        while(candidate != null){
            if(key.equals(candidate.getKey())){
                return candidate;
            }
            candidate = candidate.next;
        }
        return null;
    }

    private boolean containsKey(K key) {
        return false;
    }

    private static class TableEntry<K,V>{
        K key;
        V value;
        TableEntry next = null;

        public TableEntry(K key, V value, TableEntry next){
            this.key = key;
            this.value = value;
            this.next = next;
        }

        K getKey(){
            return key;
        }

        V getValue(){
            return value;
        }

        void setValue(V value){
            this.value = value;
        }

        @Override
        public String toString(){
            return "Key:" + (String)key + "Value:" + (String)value;
        }
    }
}

您无法在那些位置进行比较 - 也根本无法访问它们,因为它们超出了范围。您已在 if 语句的 'else' 部分声明了它们,因此这是它们的范围。

因此,解决方案是将声明移到 if 之外,或者将您的代码移到 'else' 代码块内。您选择哪个取决于您是想随后访问 'slotNumber' 还是 'candidate';如果没有,那么我个人更喜欢第二个,所以 :

    if(this.containsKey(key)){
        TableEntry<K,V> foundKey = (TableEntry<K,V>)this.getTableEntry(key);
        foundKey.setValue(value);
    } else{
        int slotNumber = Math.abs(key.hashCode()) % size;
        TableEntry<K,V> candidate = (TableEntry<K,V>) elements [slotNumber];

        // empty slot
        if(candidate == null){
            elements[slotNumber] = new TableEntry(key,value,null);
        }else{
            while(candidate != null){
                candidate = candidate.next;
            }
            candidate.next = new TableEntry(key,value,null);
        }
    }

您对 candidateslotNumber 变量的声明仅在包含它们的最内层块中可见,在本例中不包含任何其他内容。看起来您想将使用这些变量的代码移到该块中(而不是将声明移出它):

    @SuppressWarnings("unchecked")
    public void put(K key, V value){
        if (this.containsKey(key)) {
            TableEntry<K, V> foundKey = this.getTableEntry(key);
            foundKey.setValue(value);
        } else {
            int slotNumber = Math.abs(key.hashCode()) % size;
            TableEntry<K,V> candidate = (TableEntry<K, V>) elements[slotNumber];

            // empty slot
            if (candidate == null) {
                elements[slotNumber] = new TableEntry<K, V>(key, value, null);
            } else {
                while (candidate != null) {
                    candidate = candidate.next;
                }
                candidate.next = new TableEntry<K, V>(key, value, null);
            }
        }
    }