2010-03-09 38 views
56

在Android应用测试套件我有这样一类,其中B一种观点:如何在运行时检查子类是否为类的实例?

public class A extends B { 
... etc... 
} 

现在我有可能含有A对象,但在这种情况下,我只在乎他们是否”查看对象的列表子类或“B”的“实例”。我想这样做:

ArrayList<View> viewList = getViews(); 
Iterator<View> iterator = viewList.iterator(); 
while (iterator.hasNext() && viewList != null) { 
    View view = iterator.next(); 
    if (view.getClass().isInstance(B.class)) { 
     // this is an instance of B 
    } 
} 

的问题是,当if遇到A对象不计算为一“的B实例”。有没有办法做isSubclassOf什么的?

+1

如果Viewlist产品阵列为空,那么你的程序崩溃,甚至检查,而没有帮助。 – Tim 2012-04-27 09:44:31

+2

From Effective C++,作者:Scott Meyers:“如果对象是T1类型的话,任何时候你发现你自己都在编写代码”,然后做一些事情,但是如果它是T2类型的,那么做一些其他的事情,“拍打你自己。不是使用重写的方法,而是使用访问者模式 – ishmeister 2010-03-10 11:07:13

+1

这是一个测试用例,所以代码实际上不在生产应用程序中,而是测试以确保事物使用正确的类:) – iamamused 2010-03-11 05:01:16

回答

136

您必须仔细阅读此方法的API。有时你会很容易感到困惑。

它可以是:

if (B.class.isInstance(view)) 

API说:确定是否指定的Object(参数)是分配兼容由该Class(类对象你表示的对象被调用的方法)

或:

if (B.class.isAssignableFrom(view.getClass())) 

API说:确定是否通过该Class对象表示的类或接口或者是相同,或是一个超类或超接口,指定由表示的类或接口类参数

或(无反射和推荐一个):

if (view instanceof B) 
+9

if for(view instanceof B)。简单而有效。 – 2012-10-23 10:28:09

+10

请注意,由于擦除,'instanceof'不适用于泛型。 – Qix 2013-03-06 09:10:51

+1

@Qix感谢您的信息。擦除是一个以上的身体部位疼痛,但没有泛型工作更糟糕。 – Hardcoded 2013-05-15 07:51:29

21
if(view instanceof B) 

如果view是B或A的子类(或B的任何子类)的实例,则这将返回true。

+2

我想提一下,必须将B导入到当前的.java文件中才能工作,Eclipse会将该行标记为有错误,但不提供有用的解决方案否则(在意识到我刚刚没有导入类文件之前尝试了不同的语法浪费了将近一个小时)。对于任何想知道的人,正确的语法是((instance name)instanceof(Class name))。Th e字课不会出现在任何地方。 – ArtOfWarfare 2012-11-15 19:32:53

8

也许我失去了一些东西,但是这是不是足够了:

if (view instanceof B) { 
    // this view is an instance of B 
} 
2

它周围的其他方法:我从来没有真正使用这一B.class.isInstance(view)

-1

,但尽量view.getClass().getGenericSuperclass()

+1

该方法被严重命名并记录在案。它不会帮助解决这个问题,因为A和B都没有任何泛型。 – Hardcoded 2013-06-24 14:46:06

0

如果存在多态性,例如检查SQLRecoverableException VS的SQLException,可以这样做。

try { 
    // sth may throw exception 
    .... 
} catch (Exception e) { 
    if(SQLException.class.isAssignableFrom(e.getCause().getClass())) 
    { 
     // do sth 
     System.out.println("SQLException occurs!"); 
    } 
} 

简单的说,

ChildClass child= new ChildClass(); 
if(ParentClass.class.isAssignableFrom(child.getClass())) 
{ 
    // do sth 
    ... 
} 
+1

不要做类似于捕获异常和检查异常的类,如果你没有真正的理由。 代替: '} catch(SQLException e){ } catch(Exception e){ } – Hardcoded 2014-12-15 15:04:22

相关问题