sobreescritura sobrecarga que polimorfismo overload metodos constructores conclusion java

que - sobrecarga overload java



¿Cómo se resuelve la ambigüedad en la selección de métodos sobrecargados en Java? (5)

package org.study.algos; public class Study { public static void main(String[] args) { A a = new A(); a.m1(null); } } class A { public void m1(String s) { System.out.println("String"); System.out.println(s); } public void m1(Object obj) { System.out.println("Object"); System.out.println(obj); } }

Aquí, la salida es

Cadena nula

¿Por qué la JVM resuelve el método en uno con un argumento de cadena?

Gracias de antemano j


El valor nulo se puede establecer como referencia de cualquier tipo. Todos los métodos sobrecargados que tiene están en una jerarquía de herencia. Objeto <- Cadena, se elige el menos general. Pero si tenía dos métodos sobrecargados que no están en la misma jerarquía, obtendría un error de compilación sobre los métodos ambiguos.


Es un algoritmo bastante elaborado, detallado en JLS 15.12 . Pero la parte relevante aquí es 15.12.2 , que dice "se elige la más específica". Tanto la sobrecarga del objeto como de la cadena son "accesibles y aplicables" (la cadena es aplicable porque un literal nulo es una referencia de todos los tipos), y la cadena es más específica.

EDITAR: Sección corregida, por sintáctica.


Estos métodos están "sobrecargados", no "ambiguos".

Según la especificación del lenguaje Java :

Cuando se invoca un método (§15.12), el número de argumentos reales (y cualquier tipo de argumento explícito) y los tipos de tiempo de compilación de los argumentos se utilizan, en tiempo de compilación, para determinar la firma del método que se invocará ( §15.12.2).

Y §15.12.2 dice:

Puede haber más de uno de estos métodos, en cuyo caso se elige el más específico .

String es más específica que el Object , por lo que si bien null es compatible con ambos, se elige el método con el parámetro String (hay reglas mucho más complejas que se aplican cuando los tipos de parámetros son parte de una clase o jerarquía de interfaz).



Una cadena es un objeto, un objeto no es una cadena, por lo que la primera sobrecarga es más específica que la segunda. Ver JLS 15.12.2 , como se menciona en Syntactic.