我试图理解为什么我会收到此错误:
- 这是错误 -
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)?
答案 0 :(得分:7)
List
不是 Iterator
。 List
有 Iterator
。 List 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>
接口上的通用类型参数类Iterable
在interface
方法中得到回应。
修改强>
从OP发布的课程中,Entry
interface
和Entry
iterator()
方法中的Entry
之间存在混淆。
您的<K,V>
类在iterator
中是通用的,并且您的方法根本不是通用的。
因此,您的界面要求您的Entry
方法从Entry<?,?>
方法返回原始iterator
或Entry<K,V>
。
据推测,您的实现类实现了Iterator<Entry<K,V>>
并在其方法实现中返回interface
。
这与interface
中的合同不兼容。
您的Iterator<Entry<Key,Value>> iterator();
方法应为:
interface
更一般地说:
Iterable<Entry<K,V>>
应该扩展HashTableInterface<K,V>
而不是添加自己的自定义方法,这样您就可以使用增强的for-each-loop。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();
}
只会增加噪音。因此,您的List<Entry<K, V>>
需要分成两部分,最后会:
List<TableEntry<K, V>>
编辑MK2
Entry
与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();
}
}
类型。因此编译器抱怨您的实现没有实现List
。
这是一个有效的例子;
List<TableEntry<K, V>>
请注意,如果我将{{1}}更改为{{1}},则代码将无法编译。
这里的关键点是永远不要把课程叫做同样的事情,即使这看起来是个好主意。