我已经看了一会儿,虽然它并不重要,但我想知道是否有一种整洁的方式(也许是1个班轮),我可以用来检查一个物体是否是例如,我可以做的几个类中的任何一个的实例:
public_path()
依此类推。有没有更好的方法来做到这一点,或者这是否与我想要的一样好?
答案 0 :(得分:3)
instanceof
就是你想要的。
请记住,instanceof也会为超类返回true。
如果要查看对象是否是类的直接实例,可以比较该类。您可以通过getClass()方法获取实例的类对象。并且您可以通过ClassName.class静态访问特定的类。
一个例子:
if (anObject.getClass() == Pupil.class) {}
在上面的示例中,如果anObject
是Pupil
的实例,则条件为真,但如果anObject
是Pupil
的子类的实例,则不是。< / p>
相比之下:
if (anObject instanceof Pupil) {}
在instanceof
示例中,如果anObject
是Pupil
的实例,或者anObject
是子类的实例 Pupil
。
通常,instanceof是正确的方法。
答案 1 :(得分:1)
制作一个Collection
个Class
个您选择的对象......
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())) { ... }