【问题标题】:Parametrized object cannot be resolved to variable [duplicate]参数化对象无法解析为变量[重复]
【发布时间】:2015-10-29 21:11:14
【问题描述】:

我有这段代码:

    @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() 构造函数的调用也是如此。你能告诉我为什么我不能将例如候选人与 null 进行比较吗?

如果需要,这里有完整的类(哈希表):

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

【问题讨论】:

    标签: java parameters


    【解决方案1】:

    您对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);
                }
            }
        }
    

    【讨论】:

    • 在您的版本之后,我收到消息:候选人无法解析为变量
    • 仅当存在单独的潜在错误时。始终从上到下调试 Java 编译错误。实际上,您似乎对数组elements 的元素类型有些混淆:您声明它是V,但显然假设它是TableEntry&lt;K, V&gt;。类型擦除可能会在实践中发挥作用,但编译器可能仍然反对。
    【解决方案2】:

    那时您无法在这些位置进行比较 - 也根本无法访问它们,因为它们超出了范围。您已经在 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);
            }
        }
    

    【讨论】:

      猜你喜欢
      • 2015-01-12
      • 1970-01-01
      • 1970-01-01
      • 2011-06-23
      • 1970-01-01
      • 1970-01-01
      • 2016-01-15
      • 2020-04-10
      相关资源
      最近更新 更多