No creo que nadie más que los diseñadores de la lengua podría posible respuesta a esta pregunta. No soy casi un experto en el tema, pero proporcionaré solo mi opinión.
Al leer el JLS 15.12 sobre Método de expresiones de invocación, es bastante claro que elegir el método correcto para ejecutar es un proceso de tiempo de compilación ya complicado; sobre todo después de la introducción de los genéricos.
Ahora imagine mover todo esto al tiempo de ejecución solo para admitir la característica única de mutimethods. Para mí, suena como una pequeña característica que agrega demasiada complejidad al lenguaje, y probablemente sea una característica con cierta cantidad de implicaciones de rendimiento ahora que todas estas decisiones deberían tomarse, una y otra vez, en tiempo de ejecución, y no solo una vez, como lo es hoy, en tiempo de compilación.
A todo esto podríamos agregar el hecho de que debido a type erasure sería imposible determinar el tipo real de ciertos tipos genéricos. Me parece que abandonar la seguridad de la comprobación de tipos estáticos no es lo mejor para Java.
En cualquier caso, existen alternativas válidas para hacer frente al problema del envío múltiple, y quizás estas alternativas justifiquen por qué no se han implementado en el lenguaje. Por lo tanto, puede usar el clásico visitor pattern o puede usar cierta cantidad de reflexión.
Hay un anticuado MultiJava Project que implementó mutiple apoyo de despacho en Java y hay un par de otros proyectos por ahí que utilizan la reflexión para apoyar métodos múltiples en Java: Java Multimethods, Java Multimethods Framework. Quizás haya aún más.
También podría considerar un lenguaje alternativo basado en Java que admita multimétodos, como Clojure o Groovy.
Además, dado que C# es un lenguaje bastante similar a Java en su philopofia general, podría ser interesante investigar más sobre cómo es supports multimethods y meditar sobre cuáles serían las implicaciones de ofrecer una característica similar en Java. Si crees que es una característica que vale la pena tener en Java, incluso puedes enviar un JEP y se puede tener en cuenta para futuras versiones del lenguaje Java.
Estoy tratando de imaginar cómo funcionaría la semántica de este enfoque, y mi cerebro simplemente dice "ew". Espero poder cambiar la implementación que estoy usando de una interfaz, y hacer que el resto del código funcione exactamente igual. –
Porque tratar estáticamente de determinar el tipo de tiempo de ejecución de un objeto sería similar a simplemente ejecutar el programa? – Perception
@Perception Pregunta por qué el despacho de sobrecarga no se pudo aplazar al tiempo de ejecución en lugar de resolverse en tiempo de compilación. Parece que esto agregaría una enorme complejidad a la JVM y la lógica de carga de clases. –