5

为避免必须这样做:

if (obj instanceof Class) {
    someHandlingMethod((Class) obj);
}
else if (obj instanceof AnotherClass) {
    someHandlingMethod((AnotherClass) obj);
}

是否可以将 Object 自动转换为其已知类,如 所述obj.getClass().getName()

其次,它是否整洁可靠?还是使用“责任链”或“处理程序”模式会更好?

对于上下文:

在我的程序中接收到的对象是从通过网络传输的 ObjectInputStream 读取的对象。收到的所有对象都是“消息”类型,然后我有几个消息类型的子类(例如 AuthenticateRequest、ViewRequest)。我想以不同的方式处理这些。

4

3 回答 3

6

您尝试执行的操作称为动态调用。您可以做的最接近的事情是使用反射。

Method method = getClass().getMethod("someHandlingMethod", obj.getClass());
method.invoke(this, obj);
于 2013-04-28T20:04:05.043 回答
0

您可以使用castClass 对象具有的方法:

Class clazz = obj.getClass();
clazz.cast(obj);

另一种选择:如果您有权访问someHandlingMethod代码,则可以添加类型参数Class并将其传递obj.getClass()给它。

public void someHandlingMethod(...., Class clazz);

public void someHandlingMethod(...., AnotherClass clazz);

您不需要使用此参数。这将只允许您调用正确的重载。

于 2013-04-28T20:07:14.157 回答
0

这是访问者模式的工作。太有名了,这里不需要解释。参见四人帮,或维基百科。

于 2013-04-28T22:39:59.293 回答