Java抱怨我的天堂';t实现了一种方法
我有以下界面:Java抱怨我的天堂';t实现了一种方法,java,Java,我有以下界面: 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(); /** *
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 void setNext();
接口IBasicListNode{
/**
*返回当前元素
*/
公共T getElement();
/**
*获取下一个ListNode。如果没有下一个元素,则返回null
*/
公共IBasicListNode getNext();
/**
*设置下一个ListNode
*/
public void setNext(IBasicListNode节点);
}
还有一节课:
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;
}
}
类BasicListNode实现IBasicListNode{
受保护的T_元素;
受保护的BasicListNode\u next;
公共T getElement(){
把这个还给我;
}
public BasicListNode getNext(){
把这个还给我;
}
public void setNext(BasicListNode节点){
这个。_next=节点;
}
/**
*遍历ListNodes,直到getNext()返回null
*/
public BasicListNode getLast(){
BasicListNode tmp=此;
while(tmp!=null){
tmp=tmp.getNext();
}
返回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> {
^
jiewmeng@JM-PC:/labs/Uni/CS1020/Lab/03/prob 2/LinkedList$javac BasicListNode.java
java:1:BasicListNode不是抽象的,并且不重写
IBasicListNode中的抽象方法setNext(IBasicListNode)
类BasicListNode实现IBasicListNode{
^
为什么java没有检测到BasicListNode实现IBasicListNode
?接口类中的setnext()
public void setNext(BasicListNode节点);
缺少在类中实现的参数。更改接口以匹配类或更改类以匹配接口,它将停止抱怨
您的界面应为:
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);
}
公共接口IBasicListNode{
/**
*返回当前元素
*/
公共T getElement();
/**
*获取下一个ListNode。如果没有下一个元素,则返回null
*/
公共IBasicListNode getNext();
/**
*设置下一个ListNode
*/
public void setNext(IBasicListNode节点);
}
对于下一个错误,请记住
public
公共类BasicListNode实现BasicListNodeI
及
公共接口IBasicListNode
它很简单
您没有在没有参数的情况下重新实现方法public void setNext()
如果您需要它来避免抱怨,请将您的接口更改为像这样声明setNext
public void setNext(BasicListNode<T> node);
public void setNext(BasicListNode);
或者像声明的那样实现接口;-)在接口中:
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 void setNext();
在你们班:
public void setNext(BasicListNode<T> node)
public void setNext(BasicListNode)
这里的问题是您需要实现该方法:
public void setNext(IBasicListNode<T> node);
然后在BasicListNode
类中实现该方法,如下所示:
public void setNext(IBasicListNode<T> node);
public void setNext(IBasicListNode<T> node) {
this._next = node;
}
if(node instanceof BasicListNode<?>) {
this._next = (BasicListNode<T>)node;
}
这是必需的,因为
不是可在编译时检查的类型,因为您不知道在运行时将使用什么类型。
允许您接受任何泛型类型的BasicListNode
至于为什么getNext()
尽管返回类型与泛型的功能略有不同,但该方法仍然有效。使用泛型时有很多特殊情况,需要花费更多的时间来理解。有关更多详细信息,我建议您查找泛型,或许可以看看这篇文章。公认的答案只会让人觉得很肤浅gs有点混乱,所以我建议看一下Cam提供的第二个答案。您的界面有以下方法:
public void setNext(IBasicListNode<T> node);
public void setNext(IBasicListNode节点);
但你们班有一个:
public void setNext(BasicListNode<T> node) {
public void setNext(BasicListNode){
因此,契约不受尊重:接口方法接受IBasicListNode
的任何实现作为参数,而类方法只接受特定的basiclitnode
实现。请注意,setNext方法的签名在super和具体类中是不同的,因此您不会被忽略是的,我更新了界面&错误,它仍然不起作用。我更新了我的帖子,修改了界面&新的(但类似的)错误更新了答案,你忘了在课堂和界面中添加public。好的,我会添加public,这似乎总是被我学校的讲师/教学人员忽略“骨架“文件,有什么原因吗?关于检查会是什么样的。然后我想我应该在其他文件中抛出一个异常?但是哪一个?InvalidArgumentException?还请注意,我在执行instanceof BasicListNode
必须使用instanceof BasicListNode
时出错。它们是一样的吗?为什么public BasicListNode getLast()
work?假设您的接口和实现类都在同一个包中,它实际上可以在不使用公共修饰符的情况下工作,因为如果不使用公共修饰符,它将默认为有时称为包私有的包,并且在同一个包中对所有人都可见。有关其他问题的详细信息,请参阅我下面的帖子,因为我将添加这篇文章的答案。谢谢你的精彩解释。但是你能详细说明一下?extensed E
是如何使用的吗?@jiewmeng我想知道,如果我的类坚持允许IBasicListNode
而不是说expectBasicListNode
(参数)是不是更好的设计如果我的函数只需要使用在IBasicListNode
中定义的方法,那么返回如何?我是否应该总是返回一个更具体的类型,这样就有空间将其转换为更通用的类型?如果我的方法签名显示我需要一个IBasicListNode
,并抛出一个异常,说我需要一个,这看起来很混乱e> BasicListNode
。我发现如果在实现中使用IBasicListNode,如果我需要在BasicListNode