2013-11-04 55 views
0

我想写一个方法,将遍历ArrayList,然后确定内部存储的对象是ClassA还是ClassB(这些类扩展类类型),如果他们是,将会返回一个int变量(counter)并将计数为ClassA + ClassB对象。测试一个对象,并确定它是否是类x

我试图做这样的事情:

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

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

谢谢。

+0

我想你正在寻找'Class'类的'isAssignableFrom'方法。它告诉你一个类或接口是否是另一个类的超类型。你是这个意思吗?如果没有,请澄清你的问题。 –

回答

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

+1

+1用于指出原始错误(缺少'.class')。 –

+0

谢谢,完美的答案。 – Aaron

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的一个实例而不是它们的一个子类。

+0

我也会用这种方法:) –

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; 
} 
相关问题