![](/img/trans.png)
[英]How can I force Java to accept a conditional type for one of the parameters of a method call?
[英]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.