围绕Java';没有双重分派/访问者模式的静态方法分派

围绕Java';没有双重分派/访问者模式的静态方法分派,java,overloading,multiple-dispatch,method-dispatch,dynamic-dispatch,Java,Overloading,Multiple Dispatch,Method Dispatch,Dynamic Dispatch,我使用的类Foo提供了以下方法: String overloadedMethod(Object) String overloadedMethod(Goo) 由于Java静态地分派非接收方参数,因此我不能只传递我的值(这是一个对象,但可能具有动态类型Goo),并依赖JVM动态地选择“正确”方法 这是我目前(丑陋的)工作重点: Object value = ...; Foo foo = new Foo(); if (value instanceof Goo) { Goo gooValue

我使用的类
Foo
提供了以下方法:

String overloadedMethod(Object)
String overloadedMethod(Goo)
由于Java静态地分派非接收方参数,因此我不能只传递我的
(这是一个
对象
,但可能具有动态类型
Goo
),并依赖JVM动态地选择“正确”方法

这是我目前(丑陋的)工作重点:

Object value = ...;
Foo foo = new Foo();
if (value instanceof Goo) {
    Goo gooValue = (Goo) value;
    return foo.overloadedMethod(gooValue); // -> overloadedMethod(Goo)
} else {
    return foo.overloadedMethod(value);    // -> overloadedMethod(Object)
}

如果不修改
Foo
(包含重载方法的类)中的代码,是否有更好的方法来执行此操作?

当然,您可以始终使用反射来查找应用的方法的最具体版本,但这可能会很快变得棘手

但是,如果这两个调用导致完全不同的行为,那么Foo要么被设计用于访问者模式(即双重分派),要么就被破坏了。

您可以看看。它几乎是围绕着你的提议的一层,但至少它被抽象成一个逻辑模块,这不是你的责任

(据我所知,如果不借助黑客的反射/实例,没有干净的方法可以做到这一点)