簡體   English   中英

Java:從通用列表/集合派生

[英]Java: Deriving from a generic List/Collection

我在理解Java語言時遇到了一些問題

public class PhonebookEntryList extends List<PhonebookEntry>
{
    public PhonebookEntryList(String filename) throws IOException
    {
        //loadListFromFilename(filename);
    }

    public void saveListToFilename(String filename) throws IOException
    {
        //Do something to save it to a file
    }
}

我不能這樣做,因為List是一個通用類型(當然)。 我知道這意味着什么,但是目前我無法想到該問題的解決方案。

你能幫我解決嗎? 謝謝!

不,您唯一的問題是您正在extend interface 您必須改為implement它。

public class PhonebookEntryList implements List<PhonebookEntry>

應該管用; 或者您可能想擴展一個具體的類:

public class PhonebookEntryList extends ArrayList<PhonebookEntry>

要么

public class PhonebookEntryList extends LinkedList<PhonebookEntry>

您不能這樣做,因為List是一個接口。 但! 您不應該擴展或實現List類來制作PhonebookEntryList,這是設計錯誤。

你應該做:

public class PhonebookEntryList
{
    private List<PhonebookEntry> entries;

    public PhonebookEntryList(String filename) throws IOException
    {
        //loadListFromFilename(filename);
    }

    public void saveListToFilename(String filename) throws IOException
    {
        //Do something to save it to a file
    }
}

即您的PhonebookEntryList應該包含一個列表,而不是繼承它。

List<T>是一個接口,而不是一個類,因此您不能從中繼承。 但是,如果您要創建,則可以從泛型類型繼承,並提供類型參數,例如,特定類型的集合,其行為僅特定於該類型。

如果您查看JavaDoc for List ,您將看到(如其他人所提到的)它是一個接口,而不是一個類。 您最可能想做的是在同一JavaDoc頁面上的“所有已知的實現類”上看到,您將看到AbstractList 擴展這個。 或者,擴展非抽象List實現之一。

注意:大多數情況下,當有人開始擴展Java Collection類之一時,您走的路就錯誤。 通常,最好使用類中的現有集合之一,並代理所需的任何集合樣式請求。 或返回您的收藏的不可修改的代理:

public class MyClass {
  private final List<PhonebookEntry> myList = new LinkedList<PhonebookEntry>();

  public List<PhonebookEntry> getList() {
    return Collections.unmodifiableList(myList);
  }
}

通常,僅當您打算與所擴展的類具有不同的行為時,才最好擴展該類。 繼承比組成更脆弱。

List<T>是一個接口。

如果要extend類,則必須選擇一個實現(也許是ArrayList<T> ): extends ArrayList<PhonebookEntry>

如果要實現List請將代碼更改為: implements List<PhonebookEntry>

您的問題是您試圖擴展接口而不是實現它。

構圖就是您想要的。 創建一個包裝列表(或實現該接口的東西)的類

並添加功能。

我應該提到列表是接口而不是類嗎? 沒事 我想您現在明白了。

但是,我想指出的是,通常最好不要將持久性機制嵌入列表類中。 有一種叫做“訪問者”模式的東西可以更好地工作。 通過將實際的持久性代碼放在單獨的類中,可以降低應用程序的整體邏輯復雜度(以額外的類為代價),並且您的電話簿可以解放出來,用於依賴於看起來不錯的持久性機制的地方當您第一次設計代碼時,看起來不再那么好了。 例如,如果要使電話簿成為ORM引用數據庫中的一項。

暫無
暫無

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

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