Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/359.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java抱怨我的天堂';t实现了一种方法_Java - Fatal编程技术网

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
而不是说expect
BasicListNode
(参数)是不是更好的设计如果我的函数只需要使用在
IBasicListNode
中定义的方法,那么返回如何?我是否应该总是返回一个更具体的类型,这样就有空间将其转换为更通用的类型?如果我的方法签名显示我需要一个
IBasicListNode
,并抛出一个异常,说我需要一个,这看起来很混乱e> BasicListNode
。我发现如果在实现中使用IBasicListNode,如果我需要在
BasicListNode