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