![](/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.