簡體   English   中英

如何在Java中擴展列表以存儲其他元數據並強制其僅接受一種類型的對象?

[英]How to extend a list in java to store additional metadata and force it to accept only one type of objects?

除了包含的項目外,我還必須在內部存儲列表的名稱和ID。 因此,我擴展了ArrayList ,如下所示:

class MyList<E> extends ArrayList<E>{
    private int id;
    private String name;

    MyList(int id, String name){
        this.id = id;
        this.name = name;
    }
    id getId(){       return id;   }
    String getName(){ return name; }
}

現在我意識到,此擴展將僅包含一種特定類型的對象。 那么,如何刪除列表的通用字符?

class MyList<MyObject> extends ArrayList<E>
class MyList<MyObject> extends ArrayList<MyObject>

...等等失敗。 我想實例化我的清單

MyList mylist = new MyList();

...並且它應該僅自動接受MyObject s ...

(最好創建一個包裝,該包裝除了包含meta之外還包含一個ArrayList ?但是由於它仍然是一個列表,因此為什么要刪除所有列表類型的功能...)

你需要

class MyList extends ArrayList<MyObject>

當您為類聲明聲明類型參數時,就像這樣

class MyList<MyObject> ...

類型MyObject>不是您的類型,它是一個類型變量,也具有名稱MyObject

您想要的是使用MyObject類型作為ArrayList類型參數的類型參數,如上所示。


但是,正如其他人所建議的那樣,合成可能是一種更好的方法,例如,您在問題中建議的包裝器。

正如已經回答的那樣,正確的聲明是

class MyList extends ArrayList<MyObject>

即使您對覆蓋任何ArrayList方法都不感興趣,對於這種類型的方案,也應考慮在繼承上進行組合。

例:

class MyList implements Iterable<MyObject> {
    private final int id;
    private final String name;
    private final List<MyObject> list;

    MyList(int id, String name){
        this.id = id;
        this.name = name;
        this.list = new ArrayList<>();
    }

    int getId()                     { return id; }

    String getName()                { return name; }

    MyObject get(int i)             { return list.get(i); }

    void add(MyObject o)            { list.add(o); }

    void remove(MyObject o)         { list.remove(o); }

    void remove(int i)              { list.remove(i); }

    void set(int i, MyObject o)     { list.set(i, o); }

    boolean contains(MyObject o)    { return list.contains(o); }

    int size()                      { return list.size(); }

    @Override
    Iterator<MyObject> iterator()   { return list.iterator(); }
}

有了這個:

  • 您可以輕松地將ArrayList切換為LinkedList或任何其他列表。
  • 您可以控制此類提供的方法。
  • 如果您喜歡鏈接樣式,則可以更改MyList那些void

暫無
暫無

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

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