测试一个Object并确定它是否为Class x

时间:2013-11-04 07:20:00

标签: java reflection

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

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

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

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

感谢。

3 个答案:

答案 0 :(得分: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)并不是一回事。 如果type是ClassA或ClassB的子类,Instanceof也会返回truetype.getClass().equals(ClassA.class)仅评估true,如果type是ClassA的实例而不是其子类之一。

答案 1 :(得分: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

答案 2 :(得分: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;
}