[英]When using Java interface in Scala, compiler complains method not implemented
[英]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.