Java抱怨我还没有实现一个方法

时间:2011-10-02 13:27:20

标签: 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();

  /**
   * 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>

5 个答案:

答案 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>实现。