我一直想知道Java中的一个函数,我希望它存在。我想迭代一个Arraylist(比如A类),它包含类B和C的对象,它们都扩展了A.这个想法,我只想迭代(例如)ArrayList中B类的对象。
这怎么可能,比如下面代码中的简短示例,而没有长代码?
主要班级:
import java.util.*;
public class Test {
public static void main(String[] args) {
new Test ();
}
Test() {
ArrayList<A> a = new ArrayList<A> ();
a.add (new B ());
a.add (new C ());
a.add (new C ());
a.add (new B ());
a.add (new C ());
for (A aObject : a) { // this works, I want it shorter
if (aObject instanceof B) {
B b = (B) aObject;
System.out.println (b.hi);
}
}
for (B b : a) // like this?
System.out.println (b.hi);
}
}
A:
public class A {
}
B:
public class B extends A {
String hi = "hi";
}
C:
public class C extends A {
}
编辑:因为有这么多人回答这个问题:我知道使用instanceof。我想要一种更快的方法来遍历数组中的所有对象,其中类是B。
答案 0 :(得分:2)
答案 1 :(得分:2)
您可以为它创建一个可重用的Filter类,类似于FileFilter
。 (参见korifey关于使用番石榴的答案。)除此之外,不,没有任何现有的功能。此外,任何现有功能都必须完全按照您的要求进行操作,因为List
类型无法知道列表中不同类别的对象的位置。 (它必须迭代它们才能找到它们。)
如果您需要一个高性能的解决方案,您可以考虑为单独的实例存储单独的列表 - 替换当前列表或作为当前列表的补充。你甚至可以将它包装在一个复合类中,该类通过一个通用的API提供两种功能(所有实例和类的实例)。
答案 2 :(得分:0)
我同意JRSofty。
for (A aObject : a) {
if (aObject instanceof B) { // <-- This is as short I can make it
B b = (B) aObject;
System.out.println (b.hi);
}
}
答案 3 :(得分:0)