30

我有一个基类,Statement其他几个类继承自,命名IfStatementWhereStatement等...在语句中执行测试if以确定Statement实例派生自哪种类的最佳方法是什么?

4

6 回答 6

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

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

于 2009-05-29T23:25:31.293 回答
64
if (obj.getClass().isInstance(Statement.class)) {
   doStuffWithStatements((Statement) obj));
}

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

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

于 2009-05-29T23:25:22.540 回答
6

你的问题的答案是instanceof。

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

于 2009-05-29T23:30:28.193 回答
2

isAssignableFrom(java.lang.Class)从课堂上是你的答案。

于 2011-10-20T06:31:21.800 回答
1

试试这个:

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

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

于 2016-10-07T21:10:12.757 回答
0

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

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

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

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

obj.doStuff();

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

于 2009-05-29T23:43:17.077 回答