通过扩展类迭代Arraylist

Hid*_*dde 5 java iteration class

我一直想知道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);
    }
}
Run Code Online (Sandbox Code Playgroud)

A:

public class A {

}
Run Code Online (Sandbox Code Playgroud)

B:

public class B extends A {
    String hi = "hi";
}
Run Code Online (Sandbox Code Playgroud)

C:

public class C extends A {

}
Run Code Online (Sandbox Code Playgroud)

编辑:因为有这么多人回答这个问题:我知道使用instanceof.我想要一种更快的方法来遍历数组中的所有对象,其中类是B.

zie*_*mer 2

您可以为其创建一个可重用的 Filter 类,类似于FileFilter. (有关番石榴的使用,请参阅 korifey 的答案。)除此之外,不,没有任何现有功能可以做到这一点。此外,任何现有功能都必须准确执行您正在执行的操作,因为类型List没有任何方式知道不同类的对象在列表中的位置。(它还必须迭代它们才能找到它们。)

如果您需要一个高性能的解决方案,您可以考虑为单独的实例存储单独的列表 - 可以替换当前列表,也可以作为当前列表的补充。您甚至可以将其包装在一个复合类中,该类将通过通用 API 提供这两种功能(所有实例和类实例)。