【问题标题】:Work around Java's static method dispatching without Double Dispatch/Visitor patterns在没有双重调度/访问者模式的情况下解决 Java 的静态方法调度
【发布时间】:2010-09-27 02:45:49
【问题描述】:

我正在使用一个提供这些方法的类Foo

String overloadedMethod(Object)
String overloadedMethod(Goo)

由于 Java 在 non-receiver 参数上静态分派,我不能只传递我的 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(包含重载方法的类)中的代码?

【问题讨论】:

    标签: java overloading multiple-dispatch method-dispatch dynamic-dispatch


    【解决方案1】:

    当然,您总是可以使用反射来找到适用的方法的最具体版本,但这可能很快就会变得很麻烦。

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

    【讨论】:

      【解决方案2】:

      您可以查看the Java MultiMethod Framework。它几乎是围绕您提议的内容的一个层,但至少它被抽象为一个逻辑模块,而不是您的责任?

      (据我所知,如果不诉诸反射/黑客攻击,没有干净的方法可以做到这一点)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-08-02
        • 1970-01-01
        • 2012-12-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多