[英]java declare a method in a implementing class and not in the interface
首先,我對Java幾乎沒有經驗。
回答我的問題,我用自己的方法實現自己的列表。
public class MyList<E> implements List<E>{
private Node<E> head;
private static class Node<E> {
private E element;
.....
}
現在,這個類中有一個方法可以將此列表與給定列表進行比較:
public boolean equals(List<E> list){
....
}
要開始這個方法,首先我們必須得到列表的頭部,所以之后我可以訪問元素並比較列表。
現在,我們沒有getHead()方法。 因此,我們嘗試在實現類中創建以下方法
public Node<E> getHead(){
編譯器找不到符號。 當然,我們需要先在界面中聲明它。 問題是,如果我們嘗試這樣做,接口就不知道Node是什么。 所以我在這里陷入僵局。
我收到錯誤:
Cannot find symbol
symbol : method getHead()
location: interface List<E>
Node<E> lhead = list.getHead();
我想讓它成為getHead特定於實現的方法。 我怎么做?
我問,我們可以將實現中的內部類移動到接口嗎? 不知道如何解決這個問題,
謝謝你的時間
您是否正在實現java.util.List
或您創建的一些自定義List
接口? 如果您使用的是標准類,當然您無法修改核心JDK類。
如果您有自定義List
接口,我會發現一些問題:
你的equals()
方法應該接受Object
和downcast。 否則你會超載而不是覆蓋 :
public boolean equals(Object obj) { //check type first List<E> list = (List<E>)obj;
Node
類在MyList
私有定義。 將它放在List
界面中,它可以公開訪問。
最后,通常根據內容而不是表示來定義equals()
。 您可能有多個List
實現,只要它們以相同的順序保存相同的數據,就應該認為列表是相同的。 在您的實現中,只有使用head
抽象的列表是相同的。 而不是依賴於getHead()
,使用迭代器並逐個比較項目。
getHead()
是一個特定於實現的方法,它不屬於接口。 但這也意味着您不能將它用作接口的一部分,並且您必須將其稱為實現類的方法:
List<String> myList = new MyList<String>();
myList.getHead() // Wrong. Compiler error.
MyList<String> myList = new MyList<String>();
myList.getHead() // Works :)
List<String> asList = myList; // If you want to work with a List from now on
在您的情況下,還有一個問題是equals
需要使用Object
,這意味着如果您需要使用特定於實現(甚至特定於List
)方法,則需要進行類型檢查:
public boolean equals(Object o)
if (o == this)
return true;
if( o instanceof MyList<E> ){
MyList<E> myList = (MyList<E>)o;
// do MyList stuff here ...
}
// Things to do if you're comparing something that isn't a `MyList`
// go here
}
出於好奇,但你的列表類應該有一個int getSize()
和E get(int index)
方法(這通常在列表中可用)。 現在,您可以檢查大小是否相等,如果是這樣,您可以迭代列表並逐個元素地比較(使用E get(int index)
方法)。
編輯:參考實施
public boolean equals(List<E> other) {
boolean equal = (getSize() == other.getSize());
for(int i = 0; i < getSize() && equal; i++) {
equal = get(i).equals(other.get(i));
}
return equal;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.