java dynamic method-overloading dispatch multiple-dispatch

java - Use invookedynamic para implementar envíos múltiples



method-overloading dispatch (2)

Me pregunté si la nueva instrucción invokedynamic bytecode de invokedynamic podría utilizarse para implementar despacho múltiple para el lenguaje Java. ¿La nueva API en java.lang.invoke sería útil para realizar tal cosa?

El escenario en el que estaba pensando se veía de la siguiente manera. (Esto se ve como un caso de solicitud para el patrón de diseño del visitante, pero puede haber razones por las que esta no es una opción viable).

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); } }

La clase de biblioteca MultipleDispatch haría algo así:

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. } }

(Estoy al tanto de MultiJava , pero ¿se puede lograr esto de forma puramente Java?)


Como no tengo experiencia con invoinedynamic, no sé qué tan bueno sería el rendimiento y la seguridad de tipo, pero solo puedo dar algunos consejos :


La instrucción invocada dinámica es puramente una instrucción JVM, no se relaciona con el despacho dinámico. El envío se completa con identificadores de método (el método maneja el gráfico y el método handle tree también son correctos.) Que comprende varias instancias de control de método. Una ruta en el gráfico (árbol) representa una ruta de envío.

Para su muestra dada, sería posible construir un gráfico (Diferentes personas pueden tener un resultado gráfico diferente). En este gráfico, el recorrido de los manejadores de método en el gráfico es la forma en que termina el preparado.