我有以下界面:
interface IBasicListNode<T> {
/**
* Returns the current element
*/
public T getElement();
/**
* Gets the next ListNode. Returns null if theres no next element
*/
public IBasicListNode<T> getNext();
/**
* Sets the next ListNode
*/
public void setNext(IBasicListNode<T> node);
}
一堂课:
class BasicListNode<T> implements IBasicListNode<T> {
protected T _elem;
protected BasicListNode<T> _next;
public T getElement() {
return this._elem;
}
public BasicListNode<T> getNext() {
return this._next;
}
public void setNext(BasicListNode<T> node) {
this._next = node;
}
/**
* Transverse through ListNodes until getNext() returns null
*/
public BasicListNode<T> getLast() {
BasicListNode<T> tmp = this;
while (tmp != null) {
tmp = tmp.getNext();
}
return tmp;
}
}
我得到了以下错误:
jiewmeng@JM-PC:/labs/Uni/CS1020/Lab/03/prob 2/LinkedList$ javac BasicListNode.java
BasicListNode.java:1: BasicListNode is not abstract and does not override
abstract method setNext(IBasicListNode<T>) in IBasicListNode
class BasicListNode<T> implements IBasicListNode<T> {
^
为什么java没有检测到BasicListNode<T> implements IBasicListNode<T>
?
答案 0 :(得分:4)
这里的问题是你需要实现这个方法:
public void setNext(IBasicListNode<T> node);
请注意,参数node
的类型实际上是IBasicListNode<T>
,而不仅仅是BasicListNode<T>
。
了解ArrayList
的实施方式(here)。它实现了Collection
接口。然而,没有addAll(ArrayList<T> list)
方法。相反,它必须实现Collection
接口,因此它必须实现addAll(Collection<? extends E> c)
方法。
在您的示例中,您希望将界面更改为如下所示:
public void setNext(IBasicListNode<T> node);
然后在BasicListNode
类中实现该方法,如下所示:
public void setNext(IBasicListNode<T> node) {
this._next = node;
}
*注意:您的_next
变量现在必须是IBasicListNode<T>
类型,或者您必须检查并转换为BasicListNode
。
修改强>
要清楚ArrayList
实际上可以包含一个名为addAll(ArrayList<T> list)
的方法,如果它想要,但这是可选的。但是,它必须包含一个名为addAll(Collection<? extends E> c)
的方法,以便完全实现Collection
接口。
故事的消失是,在实现接口时,您的类必须包含与其实现的接口相同的方法签名。也就是说它必须具有相同的返回类型,相同的方法名称和参数列表必须具有相同的类型和顺序。
编辑2:
要将instanceof
与泛型一起使用,您需要使用通配符<?>
,如下所示:
if(node instanceof BasicListNode<?>) {
this._next = (BasicListNode<T>)node;
}
这是必需的,因为<T>
不是可以在编译时检查的类型,因为您不知道将在运行时使用什么类型。 <?>
允许您接受任何类型的BasicListNode
通用。
至于为什么getNext()
方法有效,尽管返回类型略有不同与泛型的力量有关。使用泛型时有很多特殊情况,需要更多时间来理解它。有关详细信息,我建议您查找泛型,也可以查看此帖here。接受的答案只会让事情变得更加混乱,所以我建议你看一下Cam提供的第二个答案
答案 1 :(得分:3)
接口类中的setnext()
应为
public void setNext(BasicListNode<T> node);
它错过了在课堂上实施的论点。更改界面以匹配类或类以匹配界面,它将停止抱怨。
您的界面应该是:
public interface IBasicListNode<T> {
/**
* Returns the current element
*/
public T getElement();
/**
* Gets the next ListNode. Returns null if theres no next element
*/
public IBasicListNode<T> getNext();
/**
* Sets the next ListNode
*/
public void setNext(IBasicListNode<T> node);
}
为了您的下一个错误,请记得放
public
面前
public class BasicListNode<t> implements BasicListNodeI<T>
和
public interface IBasicListNode<T>
答案 2 :(得分:2)
在您的界面中:
public void setNext();
你班上的:
public void setNext(BasicListNode<T> node)
答案 3 :(得分:1)
这很简单
您没有重新实现方法public void setNext()
而没有参数!
如果您需要它不要抱怨,请更改您的界面以声明setNext
这样
public void setNext(BasicListNode<T> node);
或实现类似声明的接口; - )
答案 4 :(得分:1)
您的界面有以下方法:
public void setNext(IBasicListNode<T> node);
但是你的班级有这个:
public void setNext(BasicListNode<T> node) {
因此不遵守合同:接口方法接受IBasicListNode<T>
作为参数的任何实现,而类方法只接受特定的BasicListNode<T>
实现。