簡體   English   中英

java在實現類中聲明一個方法,而不是在接口中

[英]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.

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