La sobrecarga de métodos (method overloading) es la capacidad de crear varios métodos con el mismo nombre, pero con diferentes parámetros (tipo, orden, cantidad) en una misma clase. Este enfoque permite agrupar lógicamente operaciones similares y mejorar la legibilidad del código.
public class MathUtil { public int sum(int a, int b) { return a + b; } public double sum(double a, double b) { return a + b; } public int sum(int a, int b, int c) { return a + b + c; } }
Pregunta: ¿Se puede sobrecargar métodos solo por el tipo de retorno (sin cambiar los parámetros)?
Respuesta: No. La sobrecarga es posible solo con diferencias en la lista de parámetros. La diferencia solo por el tipo de retorno dará lugar a un error de compilación.
void foo(int a) {} int foo(int a) { return 1; } // ¡Error! El tipo de retorno no se considera en la sobrecarga.
Historia
En un proyecto, un desarrollador creó dos métodos:
public void process(int x, double y) {...} public void process(double x, int y) {...}Al llamar a
process(5, 10), el compilador no pudo elegir la versión correcta, lo que llevó a un error de ambigüedad en la llamada. Esto retrasó la entrega del módulo.
Historia
En una aplicación, métodos con sobrecarga basados en varargs y arreglos:
public void log(String... messages) {...} public void log(String[] messages) {...}Pasar un arreglo
String[] datano siempre llamaba a la sobrecarga esperada, lo que provocó que algunos datos se registraran incorrectamente, ¡parte de la información se perdió! La diferencia entre un arreglo y varargs resultó ser crítica.
Historia
Un desarrollador sobrecargó los métodos de una clase sin tener en cuenta la autoboxing de tipos:
public void save(Integer i) {...} public void save(int i) {...}Al llamar a
save(null), se produjo un NullPointerException en la llamada con primitive int, ya que Java elige el tipo más específico (int), ¡pero null no se puede convertir en primitivo!