【发布时间】:2011-07-10 09:35:13
【问题描述】:
我有一个 ArrayList,例如 b,我想从该 ArrayList 中获取 Worker 的 ArrayList(Worker extend Person)。 b 还包含从 Person 扩展而来的其他对象。
我怎样才能做到这一点? 谢谢。
【问题讨论】:
我有一个 ArrayList,例如 b,我想从该 ArrayList 中获取 Worker 的 ArrayList(Worker extend Person)。 b 还包含从 Person 扩展而来的其他对象。
我怎样才能做到这一点? 谢谢。
【问题讨论】:
像这样声明你的ArrayList:
ArrayList<Worker> myArray = new ArrayList<Worker>()
现在您的ArrayList 只能包含Worker,其不同方法的返回类型将是Worker。
然后:
for(Person p : b) {
if(p instanceof Worker)
myArray.add((Worker)p);
}
【讨论】:
如果你使用Guava,就这么简单:
ArrayList<Person> b;
ArrayList<Worker> a = Lists.newArrayList(Iterables.filter(b, Worker.class));
【讨论】:
这是一个例子:
List<Person> b = ...
List<Worker> workers = new ArrayList<Worker>();
for (Person p : b) {
if (p instanceof Worker) { workers.add((Worker) p); }
}
【讨论】:
当按照Krtek 和h3r3 的建议遍历ArrayList b 时,请考虑使用Worker.class.isAssignableFrom(p.class)。查看What is the difference between instanceof and Class.isAssignableFrom(...)? 以了解差异。
【讨论】:
嗯,我的目标实现了:
public ArrayList<Person> getList(Class<? extends Person> type) {
ArrayList<Person> newList = new ArrayList<Person>();
for (Person p : person)
if (type.isInstance(p))
newList.add(p);
return newList;
}
我用一个 dinamyc 子类的人扩展了我的问题。 我希望对其他人有用。
【讨论】: