我有一个基类Statement
,其他几个类继承,名为IfStatement
,WhereStatement
等...在{中执行测试的最佳方法是什么? {1}}语句用于确定实例派生自哪种if
类?
答案 0 :(得分:74)
if(object instanceof WhereStatement) {
WhereStatement where = (WhereStatement) object;
doSomething(where);
}
请注意,这样的代码通常意味着您的基类缺少多态方法。即doSomething()
应该是Statement
的方法,可能是抽象的,被子类覆盖。
答案 1 :(得分:59)
if (obj.getClass().isInstance(Statement.class)) {
doStuffWithStatements((Statement) obj));
}
这种技术的好处(与“instanceof”关键字相对)是你可以将测试类作为对象传递。但是,是的,除此之外,它与“instanceof”相同。
注意:我故意避免编辑类型实例检查是否是正确要做的事情。是的,在大多数情况下,最好使用多态。但这不是OP所要求的,我只是在回答他的问题。
答案 2 :(得分:6)
你的问题的答案是instanceof。
但是,请记住,如果您的代码需要instanceof,则表明您的设计出现问题。在某些情况下,instanceof是合理的,但它们是相当例外的。通常,如果您的子类需要采用不同的行为,则必须使用多态而不是if()s。
答案 3 :(得分:2)
来自class的isAssignableFrom(java.lang.Class)就是你的答案。 http://download.oracle.com/javase/6/docs/api/java/lang/Class.html#isAssignableFrom(java.lang.Class)
答案 4 :(得分:1)
试试这个:
if (Statement.class.isInstance(obj)) {
doStuffWithStatements((Statement) obj));
}
因为Class.isInstance()方法将对象实例作为参数。
答案 5 :(得分:0)
这是不以面向对象的方式做事的方式,它是对旧代码/数据二分法的回归。现在这不一定是坏事(如果你知道你在做什么),但它应该留给像C这样的非面向对象的语言。
通过适当的设计,您不需要那种行为。而不是构造:
if (obj.getClass().isInstance(Statement.class)) {
doStuffWithStatements((Statement) obj));
}
(向'benjismith道歉'窃取'他的代码),你应该真正让对象本身对自己的活动负责:
obj.doStuff();
然后,每个不同的obj
类都有自己的doStuff
定义。这是正确的做法。