0

我正在尝试编写一个方法,该方法将迭代一个ArrayList,然后确定其中存储的对象是否是ClassAClassB(这些类扩展类类型),如果是,则int变量(counter)将递增,ClassA+ClassB对象的计数将被退回。

我正在尝试做类似的事情:

for(Types type : typeList) {
    if( type.getClass().equals(ClassA) || (type.getClass().equals(ClassB) ) {
        counter++;
    }
}
return counter;

然而,这是错误的。非常感谢有关如何执行此操作的任何指导。我在想我可以创建“虚拟”对象ClassAClassB进行比较,但是必须有更好的方法来做到这一点?

谢谢。

4

3 回答 3

3

我推荐使用 instanceof-operator。

for(Types type : typeList) {
    if( type instanceof ClassA || type instanceof ClassB ) {
        counter++;
    }
}
return counter;

另请注意,如果您null的列表中有,此方法仍将返回 false。如果您使用

type.getClass().equals(ClassA.class)

null方法,遇到时会抛出 NullPointerException 。

进一步instanceoftype.getClass().equals(ClassA.class)不一样的事情。true如果 type 是 ClassA 或 ClassB 的子类, Instanceof 也会返回。如果 type 是 ClassA 的实例而不是它们的子类之一,则type.getClass().equals(ClassA.class)仅计算为。true

于 2013-11-04T07:23:34.720 回答
3
for(Types type : typeList) {
    if( type.getClass().equals(ClassA.class) || (type.getClass().equals(ClassB.class) ) {
        counter++;
    }
}
return counter;

或者最好

for(Types type : typeList) {
    if(type instanceof ClassA || type instanceof ClassB) {
        counter++;
    }
}
return counter;

编辑:我必须指出这两种方式之间的区别。第一个不计算 和 的任何子ClassAClassB。第二个可以。首先,如果要计算子类,请使用isInstance而不是。equals

于 2013-11-04T07:23:38.483 回答
1

您最初的错误是因为您指的是类型名称本身,而不是它的Class; 要获取类型的Class对象,请使用.class,例如:

type.getClass().equals(ClassA.class)

你可以只使用instanceof,例如:

for (Types type : typeList) {
    if (type instanceof ClassA || type instanceof ClassB) {
        counter ++;
    }
}

顺便说一句,getClass().equals(...)不等于instanceof; 为此,您想使用ClassA.class.isAssignableFrom(type.getClass()).

或者,如果它在语义上有意义,您可以让对象公开确定是否应该计算它们的属性,例如:

// Base, for example:
public abstract class Types {
    abstract public boolean isInteresting();
}

// Then: 
public ClassA extends Types { 
    @Override public boolean isInteresting() { return true; }
}

public ClassB extends Types { 
    @Override public boolean isInteresting() { return true; }
}

public ClassC extends Types { 
    @Override public boolean isInteresting() { return false; }
}

// Later:
int countInterestingObjects (ArrayList<Types> typeList) {
    int counter = 0;
    for (Types type : typeList) {
        if (type.isInteresting()) {
            counter ++;
        }
    }
    return counter;
}
于 2013-11-04T07:28:14.560 回答