Java是否具有“是一种类”的测试方法

我有一个基类, Statement ,其他几个类inheritance,名为IfStatementWhereStatement等…在if语句中执行测试以确定实例派生的Statement类的最佳方法是什么?

 if (obj.getClass().isInstance(Statement.class)) { doStuffWithStatements((Statement) obj)); } 

这种技术的优点(与“instanceof”关键字相对)是你可以将测试类作为对象传递。 但是,是的,除此之外,它与“instanceof”相同。

注意:我故意避免编辑类型实例检查是否正确 。 是的,在大多数情况下,最好使用多态。 但这不是OP所要求的,我只是在回答他的问题。

 if(object instanceof WhereStatement) { WhereStatement where = (WhereStatement) object; doSomething(where); } 

请注意,这样的代码通常意味着您的基类缺少多态方法。 即doSomething()应该是一个Statement的方法,可能是抽象的,被子类覆盖。

你的问题的答案是instanceof。

但是,请记住,如果您的代码需要instanceof,则表明您的设计出现问题。 在某些情况下,instanceof是合理的,但它们是相当例外的。 通常,如果您的子类需要表现不同,则必须使用多态而不是if()s。

来自类的isAssignableFrom(java.lang.Class)是你的答案。 http://download.oracle.com/javase/6/docs/api/java/lang/Class.html#isAssignableFrom(java.lang.Class

尝试这个:

 if (Statement.class.isInstance(obj)) { doStuffWithStatements((Statement) obj)); } 

因为Class.isInstance()方法将对象实例作为参数。

不是以面向对象的方式做事的方式,它是对旧代码/数据二分法的回归。 现在这不一定是坏事(如果你知道你在做什么),但它应该留给像C这样的非面向对象的语言。

通过适当的设计,您不需要那种行为。 而不是构造:

 if (obj.getClass().isInstance(Statement.class)) { doStuffWithStatements((Statement) obj)); } 

(向benjismith道歉’窃取’他的代码),你应该真正让对象本身对自己的活动负责:

 obj.doStuff(); 

然后每个不同的obj类都有自己的doStuff定义。 这是正确的方法。