ProgramaciónDesarrollador Java

¿Qué es la sobrecarga (overloading) de métodos en Java, cómo se implementa y cuáles son las sutilezas al usarla?

Supere entrevistas con el asistente de IA Hintsage

Respuesta

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

Sutilezas:

  • Java distingue los métodos por su firma (nombre + lista de parámetros); el tipo de retorno no tiene importancia para la sobrecarga.
  • En la sobrecarga de métodos con tipos primitivos, pueden ocurrir conversiones implícitas (widening), lo que puede causar ambigüedad en la llamada.
  • El uso de varargs en métodos sobrecargados requiere precaución para no obtener resultados inesperados al llamar al método correcto.

Pregunta engañosa

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.

Ejemplos de errores reales debido al desconocimiento de las sutilezas del tema


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[] data no 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!