Java,泛型和迭代器

时间:2013-04-13 14:52:59

标签: java generics

我试图理解为什么我会收到此错误:

- 这是错误 -

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)?

1 个答案:

答案 0 :(得分:7)

List 不是 IteratorList IteratorList implements Iterable

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

您需要在iterator()上致电List以获取Iterator个实例。

所以你应该阅读方法

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

请务必致电iterator()上的List

确保implements Iterable<Entry>接口上的通用类型参数类Iterableinterface方法中得到回应。

修改

从OP发布的课程中,Entry interfaceEntry iterator()方法中的Entry之间存在混淆。

您的<K,V>类在iterator中是通用的,并且您的方法根本不是通用的。

因此,您的界面要求您的Entry方法从Entry<?,?>方法返回原始iteratorEntry<K,V>

据推测,您的实现类实现了Iterator<Entry<K,V>>并在其方法实现中返回interface

这与interface中的合同不兼容。

您的Iterator<Entry<Key,Value>> iterator(); 方法应为:

interface

更一般地说:

  1. 您的Iterable<Entry<K,V>>应该扩展HashTableInterface<K,V>而不是添加自己的自定义方法,这样您就可以使用增强的for-each-loop。
  2. 根据样式约定,我们对通用类型参数使用单个字母,因此public
  3. 默认情况下,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(); } 只会增加噪音。
  4. 因此,您的List<Entry<K, V>>需要分成两部分,最后会:

    List<TableEntry<K, V>>

    编辑MK2

    Entry interface不一样

    正如我一开始所怀疑的那样,你(令人困惑)有两个List<Entry<K, V>>类,一个嵌套在List<Entry<K, V>>中,一个嵌套在实现中。

    因此,在您的情况下,ListEntry不同。看看混乱的来源?

    您的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(); } } 类型。因此编译器抱怨您的实现没有实现List

    这是一个有效的例子;

    List<TableEntry<K, V>>

    请注意,如果我将{{1}}更改为{{1}},则代码将无法编译。

    这里的关键点是永远不要把课程叫做同样的事情,即使这看起来是个好主意。