我正在使用提供这些方法的类Foo
:
String overloadedMethod(Object)
String overloadedMethod(Goo)
由于Java静态调度非接收者参数,我不能只传递value
(Object
,但可能有动态类型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
(包含重载方法的类)中的代码?
答案 0 :(得分:3)
当然,您总是可以使用反射来查找适用的方法的最具体版本,但这可能会很快变得毛茸茸。
但如果这两个调用导致完全不同的行为,那么Foo要么被设计成用于访问者模式(即双重调度),要么被破坏。
答案 1 :(得分:2)
您可以查看the Java MultiMethod Framework。它几乎是你提出的一个层面,但至少它被抽象成一个不是你的责任的逻辑模块?
(据我所知,如果不采用反射/实例黑客攻击,没有干净的方法可以做到这一点)