使用invokedynamic实现多个分派

Mat*_*att 8 java overloading dynamic multiple-dispatch dispatch

我想知道Java7的新invokedynamic字节码指令是否可用于实现Java语言的多个调度.java.lang.invoke下的新API是否有助于执行此类操作?

我正在思考的场景如下所示.(这看起来像访问者设计模式的应用案例,但可能有理由认为这不是一个可行的选择.)

class A {} 
class A1 extends A {}
class A2 extends A {}

class SomeHandler {
    private void doHandle(A1 a1) { ... }
    private void doHandle(A2 a2) { ... }
    private void doHandle(A a) { ... }

    public void handle(A a) {
        MultipleDispatch.call(this, "doHandle", a);
    }
}
Run Code Online (Sandbox Code Playgroud)

然后库类MultipleDispatch会做类似的事情:

class MultipleDispatch {

    public static Object call(Object receiver, String method, Object...arg) {
        // something like that in byte code
        #invokeDynamic "doHandle" "someBootstrap"
    }

    static CallSite someBootstrap {
        // resolve that dynamic method call.
    }
}
Run Code Online (Sandbox Code Playgroud)

(我知道MultiJava,但这可以用纯Java方式实现吗?)

Dav*_*Far 2

由于我没有invokedynamic的经验,我不知道性能和类型安全性有多好,但只能给出一些指示