Java是否具有“是一种类”的测试方法
我有一个基类, Statement
,其他几个类inheritance,名为IfStatement
, WhereStatement
等…在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
定义。 这是正确的方法。