我正在尝试编写一个迭代ArrayList
的方法,然后确定内部存储的对象是ClassA
还是ClassB
(这些类是扩展类类型),如果是,则int
变量(counter
)将递增,并返回ClassA
+ ClassB
个对象的计数。
我正在尝试做类似的事情:
for(Types type : typeList) {
if( type.getClass().equals(ClassA) || (type.getClass().equals(ClassB) ) {
counter++;
}
}
return counter;
然而,这是错误的。任何有关如何做到这一点的指导都非常感谢。我想我可以创建ClassA
和ClassB
的'虚拟'对象进行比较,但是必须有更好的方法来做到这一点吗?
感谢。
答案 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。
进一步instanceof
和type.getClass().equals(ClassA.class)
并不是一回事。
如果type是ClassA或ClassB的子类,Instanceof也会返回true
。
type.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;
编辑:我必须指出这两种方式之间的区别。第一个不计算ClassA
和ClassB
的任何子类。第二个。对于第一个,如果要计算子类,请使用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;
}