基于具体对象类型的Java动态调度方法

基于具体对象类型的Java动态调度方法,java,dispatch,Java,Dispatch,在Java中,是否可以根据对象的运行时类型动态调度方法 定义以下层次结构: public abstract class AbstractError {...} public class GenericError extends AbstractError {...} public class ValidationError extends AbstractError {...} 是否可能有一个依赖于AbstractError对象的实际运行时类型的方法调用,例如以下对象(这似乎不起作用) 在

在Java中,是否可以根据对象的运行时类型动态调度方法

定义以下层次结构:

public abstract class AbstractError {...}

public class GenericError extends AbstractError {...}

public class ValidationError extends AbstractError {...}
是否可能有一个依赖于
AbstractError
对象的实际运行时类型的方法调用,例如以下对象(这似乎不起作用)


在Java中是否可以实现这一点或类似的功能?

从概念上讲,您希望在此处应用访问者模式。从概念上讲,您希望将
buildMessageItem()
方法中的逻辑移到相应的
*Error
类中。(顺便说一句,称为多态性…。Java中的动态调度基于调用其方法的对象的实际类型。方法参数不是多态的。理想情况下,您应该按照@TimothyTruckle的建议执行-每个错误都应该知道如何创建相应的MessageItemDTO@DmitryOgurtsov,TimothyTruckle,这么做我会介绍h错误和DTO之间的高度耦合。不是吗?我认为错误不应该知道任何关于MessageItemDTO的信息。我将尝试按照Oliver的建议,找出如何利用访问者来实现我想要的(尽管我现在不知道如何…)@OliverCharlesworth谢谢你的提示,我没有理解访问者的意思。但我不喜欢访问者的一点是,被访问的类必须实现一个非常难看的accept()方法。我知道使用反射可以摆脱accept方法,但不确定这样做是否会对性能造成影响。
public foo() {
    AbstractError error = ....
    // Here I want to decide which method to invoke on runtime (based on error concrete type)
    MessageItemDTO = buildMessageItem(error);
}

private MessageItemDTO buildMessageItem(GeneralError error) {
    // ... call here when error (declared AbstractError) is actually a GeneralError
}

private MessageItemDTO buildMessageItem(ValidationError) {
    // ... call here when error (declared AbstractError) is actually a ValidationError
}

private MessageItemDTO buildMessageItem(AbstractError error) {
    throw new UnsupportedOperationException("No dispatcher implemented for type: " + error.getClass().getSimpleName());
}