检查对象是否是任何一个类列表的实例(Android)

时间:2015-06-17 08:10:42

标签: java android

我已经看了一会儿,虽然它并不重要,但我想知道是否有一种整洁的方式(也许是1个班轮),我可以用来检查一个物体是否是例如,我可以做的几个类中的任何一个的实例:

public_path()

依此类推。有没有更好的方法来做到这一点,或者这是否与我想要的一样好?

4 个答案:

答案 0 :(得分:3)

instanceof就是你想要的。 请记住,instanceof也会为超类返回true。

如果要查看对象是否是类的直接实例,可以比较该类。您可以通过getClass()方法获取实例的类对象。并且您可以通过ClassName.class静态访问特定的类。

一个例子:

if (anObject.getClass() == Pupil.class) {}

在上面的示例中,如果anObjectPupil的实例,则条件为真,但如果anObjectPupil的子类的实例,则不是。< / p>

相比之下:

if (anObject instanceof Pupil) {}

instanceof示例中,如果anObjectPupil的实例,或者anObject子类的实例 Pupil

通常,instanceof是正确的方法。

答案 1 :(得分:1)

制作一个CollectionClass个您选择的对象......

if(myClasses.contains(obj.getClass())) {
   // obj is one of the classes I care about, so do something
}

当然,如果您打算在之后投射obj,这将无济于事(但正如我在评论中所述,这将表明存在设计问题)。

答案 2 :(得分:1)

通过使用反射,java / android有一个方法isAssignableFrom(),它允许您测试是否可以从另一个对象分配特定的Class对象。使用这个事实,您可以将测试类列表放入Class[]并通过for循环检查每个测试类,如下所示:

public static boolean assignableFrom(Class test, Class[] candidates){
    for(Class candidate : candidates){
        if(candidate.isAssignableFrom(test)){
            return true;
        }
    }

    return false;
}

在这种情况下,可以针对等效继承的多个类检查被测试类,这意味着即使该方法将返回true其中一个候选类是测试类的超类。

如果只想要实例级关系,可以考虑构建候选类的HashSet,并检查你的测试对象的类是否包含在这个HashSet中(因为这样可以提供比迭代查找更好的性能)。

答案 3 :(得分:0)

只要您只需要检查对象的确切类而不是超类,那么您可以拥有要检查的类的列表,并只检查该列表是否包含您所拥有的类。

这是一些代码......

//Set up list of classes
private static final List<Class> CLASSES = Arrays.asList(new Class[] { String.class, Double.class });

然后当你想要检查时,它就是一个班轮......

if(CLASSES.contains(anObject.getClass())) { ... }