选择某个子类的对象,并循环遍历它们?
Pick objects of a certain subclass, and loop through them?
我正在 Java 中编写应用程序。我想知道是否有一种方法可以只迭代集合中某个子 class 的对象(在我的例子中是 ArrayList)。我知道我可以使用 instanceof 并且只能使用由 class 制成的对象。而且我还知道我可以创建第二个 ArrayList,在其中放置特定 class 的对象,然后迭代该对象。但是如果我可以 "select" 迭代哪个 subclass 会非常方便。
不,您通常会使用 instanceof
(或 getClass()
)。话虽这么说,这些方法不是很适合 OOP,而且很少是最好的方法。
我建议你要么
在超级 class 中创建一个方法(具有空的默认实现),该方法被要迭代的 class 覆盖并为集合中的每个对象调用该方法, 或
使用 visitor pattern though. This answer 非常接近您的要求。
您可以使用Java 8的流来过滤正确的class:
myList.stream().filter(o -> o instanceof SpecificClass).forEach(System.out::println);
这将只打印出 SpecificClass 的对象。如果你有 class 你想 select 通过变量,你可以这样做:
Class<? extends Object> classToSelect = SpecificClass.class;
myList.stream().filter(classToSelect::isInstance).forEach(System.out::println);
我正在 Java 中编写应用程序。我想知道是否有一种方法可以只迭代集合中某个子 class 的对象(在我的例子中是 ArrayList)。我知道我可以使用 instanceof 并且只能使用由 class 制成的对象。而且我还知道我可以创建第二个 ArrayList,在其中放置特定 class 的对象,然后迭代该对象。但是如果我可以 "select" 迭代哪个 subclass 会非常方便。
不,您通常会使用 instanceof
(或 getClass()
)。话虽这么说,这些方法不是很适合 OOP,而且很少是最好的方法。
我建议你要么
在超级 class 中创建一个方法(具有空的默认实现),该方法被要迭代的 class 覆盖并为集合中的每个对象调用该方法, 或
使用 visitor pattern though. This answer 非常接近您的要求。
您可以使用Java 8的流来过滤正确的class:
myList.stream().filter(o -> o instanceof SpecificClass).forEach(System.out::println);
这将只打印出 SpecificClass 的对象。如果你有 class 你想 select 通过变量,你可以这样做:
Class<? extends Object> classToSelect = SpecificClass.class;
myList.stream().filter(classToSelect::isInstance).forEach(System.out::println);