簡體   English   中英

Java抱怨我還沒有實現一個方法

[英]Java complains I haven't implemented a method

我有以下界面:

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>

這里的問題是你需要實現這個方法:

public void setNext(IBasicListNode<T> node);

注意,參數node的類型實際上是IBasicListNode<T> ,而不僅僅是BasicListNode<T>

看看ArrayList的實現方式( 這里 )。 它實現了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()方法有效,盡管返回類型略有不同與泛型的強大功能有關。 使用泛型時有很多特殊情況,需要更多時間來理解它。 有關詳細信息,我建議您查找泛型,也可以在此處查看此帖子。 接受的答案只會讓事情變得更加混亂,所以我建議你看一下Cam提供的第二個答案

你的接口類中的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>

在您的界面中:

public void setNext();

在你班上:

public void setNext(BasicListNode<T> node)

它只是你沒有重新實現的方法public void setNext()沒有參數!

如果您需要它不要抱怨,請將您的界面更改為像這樣聲明setNext

public void setNext(BasicListNode<T> node);

或實現類似於聲明的接口;-)

您的界面具有以下方法:

public void setNext(IBasicListNode<T> node);

但你的班級有這個:

public void setNext(BasicListNode<T> node) {

因此不遵守契約:接口方法接受IBasicListNode<T>任何實現作為參數,而類方法僅接受特定的BasicListNode<T>實現。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM