如何从超类 Set 中筛选子类对象并将它们添加到子类列表中

How to filter subclass objects from superclass Set and add them to subclass List

提问人:terdev 提问时间:6/24/2021 更新时间:6/24/2021 访问量:802

问:

给出了具有以下 UML 类图的复合设计模式:

enter image description here

类 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; 
   }
}
Java 集合

评论

3赞 BeUndead 6/24/2021
您可以使用(casting)或者如果您使用的是 java 12 或更高版本。if (a instanceof C) { c_list.add((C) a); }if (a instanceof C c) { c_list.add(c); }
0赞 fps 6/24/2021
@BeUndead我相信它是从 java 14 开始的
1赞 BeUndead 6/24/2021
@fps你是对的,但我现在无法修改评论。不知道我为什么会想到 12,我想我的记忆只是“在 java 11 之后”,然后结论被跳到了。
0赞 fps 6/25/2021
@BeUndead是的,我们有古老的 Java(8 之前)、Java 8、Java 11,以及 11 :D之后的所有现代、很酷的东西

答:

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

有想要做的事情:

  1. 检查类型是否为a instanceof C
  2. 投射对象
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; 
   }
}