0

我试图了解为什么会出现此错误:

-- 这是错误 --

File: ...\HashTable.java [line: 103] Error: The return type is incompatible with HashTableInterface<Key,Value>.iterators()

该接口包含一个内部类:

public class Entry<Key, Value>{...}

LinkedList 与 java API 类似,但它包含一个迭代器内部类,但在测试一些更简单的东西时,例如:

-- 这是工作代码,至少在 drjava 的交互窗格中 --

LinkedList<String> list = new LinkedList<String>();
Iterator<String> test = list.iterator();

但是我无法在我的 HashTable 类中编译此方法:

-- 这是我无法工作的代码 --

public Iterator<Entry<Key, Value>> iterator(){
LinkedList<Entry<Key, Value>> iter = new LinkedList<Entry<Key, Value>>();
return iter.iterator();
}

我认为它很简单,看起来并不太复杂,但任何输入将不胜感激。

** 你很抱歉它应该是 list.iterator();

编辑

-- 好了,界面来了 --

import nhUtilities.containers2.*;

interface HashTableInterface<Key, Value> {

    public boolean isEmpty();

    public Value get(Key key);

    public void add(Key key, Value value);

    public void remove(Key key);

    public void clear();

    public Iterator<Entry<Key, Value>> iterator();

    public interface Entry<Key, Value> {

        public Key getKey();

        public Value getValue();

        public void setValue(Value value);

    }
}

-- 这是实现的条目,它是被破坏的方法所在的 HashTable 的内部类--

public class Entry<Key, Value> {
    private Key k;
    private Value v;

    public Entry(Key key, Value value) {
        k = key;
        v = value;
    }

    /**
     * Returns a key of pair;
     */

    public Key getKey() {
        return this.k;
    }

    /**
     * Returns value of pair;
     */

    public Value getValue() {
        return this.v;
    }
}

编辑+

所以我才意识到

public class LinkedList<Element> extends AbstractList<Element>

public abstract class AbstractList<Element> implements List<Element>

public interface List<Element> extends java.lang.Iterable<Element>

然而在 LinkedList 里面有

private class Iterator extends AbstractIterator<Element> implements nhUtilities.containers2.Iterator<Element>

也许这可能导致冲突(因为我使用的 LinkedList 不是 java API LinkedList)?

4

1 回答 1

7

List不是一个 IteratorList 有一个 IteratorList implements Iterable.

List<String> list = new LinkedList<String>();
Iterator<String> test = list.iterator();
                             //^^ here - you call iterator()

您需要调用iterator()aList来获取Iterator实例。

所以你的方法应该读

public Iterator<Entry> iterator(){
    List<Entry> iter = new LinkedList<Entry>();
    return iter.iterator();
}

确保您调用iterator().List

确保您的类作为接口implements Iterable<Entry>上的泛型类型参数在方法中得到回显。Iterableinterface

编辑

Entry从 OP 发布的课程来看,您的方法interface和方法之间似乎存在混淆。Entryiterator()

你的Entry类是通用的<K,V>,你的方法根本不是通用的。

所以你的接口要求你的iterator方法返回一个原始的Entry或者Entry<?,?>从方法中返回iterator

大概你的实现类实现了一个Entry<K,V>并在它的方法实现中返回一个Iterator<Entry<K,V>>

这与您的interface.

你的interface方法应该是:

Iterator<Entry<Key,Value>> iterator();

更普遍:

  1. interface应该扩展Iterable<Entry<K,V>>而不是添加自己的自定义方法,这允许您使用增强的 for-each-loop。
  2. 根据样式约定,我们使用单个字母作为泛型类型参数,所以HashTableInterface<K,V>
  3. 不要public在你的interface-默认情况下使用interface方法public,所以这只会增加噪音。

因此,您interface需要一分为二,最终得到:

public interface Entry<K, V> {

    K getKey();

    V getValue();

    void setValue(V value);
}

public interface HashTableInterface<K, V> extends Iterable<Entry<K, V>> {

    boolean isEmpty();

    V get(K key);

    void add(K key, V value);

    void remove(K key);

    void clear();
}

编辑 MK2

AList<Entry<K, V>>与a不同List<TableEntry<K, V>>

正如我一开始所怀疑的那样,您(令人困惑地)有两个Entry类,一个嵌套在 the 中interface,一个嵌套在实现中。

所以在你的情况下List<Entry<K, V>>是不一样的List<Entry<K, V>>。看看混乱来自哪里?

List是实现Entry,你interface需要一个Entry类型interface

同样,您Iterator<Entry..的方法返回的Entry类型错误。因此编译器抱怨你的实现没有实现你的Interface.

这是一个有效的例子;

class HashTable<K, V> implements HashTableInterface<K, V> {

    private class TableEntry<K, V> implements Entry<K, V> {
    }
    private final List<Entry<K, V>> entries = new LinkedList<>();

    @Override
    public Iterator<Entry<K, V>> iterator() {
        return entries.iterator();
    }
}

请注意,如果我更改ListList<TableEntry<K, V>>代码将无法编译。

这里的要点是永远不要将类称为同一件事,即使这看起来是一个非常好的主意。

于 2013-04-13T15:01:53.457 回答