La pregunta es, ¿cómo puede el compilador saber qué método llamar durante el tiempo de compilación, en el caso de anulación. Debe entender esto,
List list = list.getAList();
list.add(whatever);
Ahora, supongamos getAList()
método puede devolver cualquiera de los varios List
implementaciones basadas en algunos criterios. De este modo, ¿cómo puede saber un compilador qué implementación se devuelve? y qué método add()
llamar. Como puede ver, esto solo se puede decidir en tiempo de ejecución. Mientras que sobrecargar no es el caso y todo está claro en tiempo de compilación. Espero que entiendas la cosa ahora.
[Editado]
Llevar la discusión pasando en los comentarios a la respuesta real.
No se puede conocer hasta el tiempo de ejecución. Comprenda de esta manera, la creación de instancias de una clase en particular depende del argumento proporcionado por el usuario. Ahora dígame cómo el compilador sabrá qué argumento pasará el usuario y, al parecer, qué clase crear. O, lo que es más fácil aún, responda esta pregunta sobre cómo el compilador sabrá si el flujo pasará al bloque if
o al bloque else
. ¿O por qué crees que hemos verificado y excepciones de tiempo de ejecución? Tome el caso de divide-by-zero
; por ejemplo n/m
, donde m
se convierte en 0
como resultado de algún cálculo. En este caso, es obvio que el compilador no podría decir que habría un ArithmeticException
porque m
no se conoce de inmediato. Como toda esta información no está disponible en tiempo de compilación, el compilador, por lo tanto, no sabe qué método anulará cuál.
Bien, pero ¿por qué la JVM puede saberlo, pero no el compilador? – JDelage
@JDelage: Porque no se puede conocer hasta el tiempo de ejecución. Supongamos que de esta manera, la creación de instancias de una clase en particular depende del argumento proporcionado por el usuario.Ahora dígame cómo el compilador sabrá qué argumento pasará el usuario y, al parecer, qué clase crear. O aún más fácil, responda esta pregunta de cómo el compilador sabrá si el flujo se pasará al bloque 'if' o al bloque' else'. ¿O por qué crees que hemos verificado y excepciones de tiempo de ejecución? Del mismo modo, esto no se conocerá en tiempo de compilación. Por lo tanto, lo llamamos vinculante tarde. –
@JDelage: de manera más general, el [problema de detención] (http://en.wikipedia.org/wiki/Halting_problem) nos dice que no hay una forma general de predecir qué código va a hacer simplemente analizando el código (y no lo ejecuta). Todo lo que el compilador puede hacer es analizar el código; la JVM es responsable de ejecutarlo. Por lo tanto, el compilador no sabe qué ruta de código tomará a través de 'list.getAList()', y no puede, en general, saber hasta que se está ejecutando. Una vez que se ejecuta el código, por supuesto, la JVM puede intervenir y realizar un enlace dinámico. –