提问人:terdev 提问时间:6/24/2021 更新时间:6/24/2021 访问量:802
如何从超类 Set 中筛选子类对象并将它们添加到子类列表中
How to filter subclass objects from superclass Set and add them to subclass List
问:
给出了具有以下 UML 类图的复合设计模式:
类 A 是抽象的,项目是用 .
我想实现 B 类的 getAllC() 方法,通过遍历给定的 ,检查当前对象是否来自 C 类型,然后(如果为 true)将其添加到 .HashSet<A>
HashSet<A>
List<C>
我的问题是我无法想出将 C 类 - 对象插入到新 的正确想法,因为给定的具有不同的泛型参数。List<C>
HashSet<A>
到目前为止,我在代码中给出的思路(显然不起作用,只是想展示我最初的“方法”):
public class B {
private Set<A> items = new HashSet<A>();
public List<C> getAllC() {
List<C> c_list = new ArrayList<C>();
for (A a : items) {
if (a.getClass().equals(C.class)) {
c_list.add(a);
}
}
return c_list;
}
}
答:
2赞
Alberto
6/24/2021
#1
您可以使用流,其简单如下:
items.stream() .filter(el -> el instanceof C) // consider only the one you want .map(el -> (C) el) // cast them .collect(Collectors.toList()); // collect them
但是,如果你想保留你的命令式版本,你可以这样做:
public class B {
private Set<A> items = new HashSet<A>();
public List<C> getAllC() {
List<C> c_list = new ArrayList<C>();
for (A a : items) {
if (a instanceof C) {
c_list.add((C) a);
}
}
return c_list;
}
}
1赞
Beru
6/24/2021
#2
有想要做的事情:
- 检查类型是否为
a instanceof C
- 投射对象
public class B {
private Set<A> items = new HashSet<A>();
public List<C> getAllC() {
List<C> c_list = new ArrayList<C>();
for (A a : items) {
// equals() is intended to compare two object.
// You want to know if the type is equals. This is done by using instanceof
// if (a.getClass().equals(C.class)) {
if (a instanceof C)
c_list.add((C) a); // know you cast your object to its new type
}
}
return c_list;
}
}
评论
if (a instanceof C) { c_list.add((C) a); }
if (a instanceof C c) { c_list.add(c); }