Promoción automática de tipos en sobrecarga en Java

Antes de entrar en el tema real, primero, necesitamos saber acerca de la sobrecarga de métodos y las promociones de tipos.

¿Qué es la sobrecarga de métodos?

Cuando una clase consta de más de un método con el mismo nombre pero con diferentes firmas y tipos de devolución, llamamos a esos métodos sobrecargados y el proceso se denomina sobrecarga de métodos.

Ejemplo:

void method(int i)
int method(int i,int j)
void method(double d)

¿Qué es la promoción automática de tipos?

El nombre Promoción de tipo especifica que un tipo de datos de tamaño pequeño se puede promover a un tipo de datos de tamaño grande. es decir, un tipo de datos Integer se puede promocionar a long, float, double, etc. Esta promoción de tipo automática se realiza cuando cualquier método que acepta un argumento de tipo de datos de mayor tamaño se llama con el tipo de datos más pequeño.

Ejemplo: 

public void method(double a){
    System.out.println("Method called");
}

public static void main(){
    method(2);
}

En la llamada al método anterior, pasamos un número entero como argumento, pero ningún método acepta un número entero en el siguiente código. El compilador de Java no generará un error debido a la promoción automática de tipos. El entero se promueve al tipo de datos de gran tamaño disponible, doble.

Nota: es importante recordar que la promoción automática de tipos solo es posible desde un tipo de datos de tamaño pequeño a un tipo de datos de mayor tamaño, pero no de un tamaño mayor a un tamaño más pequeño. es decir, de entero a carácter no es posible.

Tipo de jerarquía de promoción

Ejemplo 1: en este ejemplo, estamos probando la promoción automática de tipo de tipo de datos de tamaño pequeño a tipo de datos de tamaño alto.

Java

class GFG {
   
    // A method that accept double as parameter
    public static void method(double d)
    {
        System.out.println(
            "Automatic Type Promoted to Double-" + d);
    }
   
    public static void main(String[] args)
    {
        // method call with int as parameter
        method(2);
    }
}
Producción

Automatic Type Promoted to Double-2.0

Explicación: Aquí pasamos un Integer como parámetro a un método y hay un método en la misma clase que acepta double como parámetro pero no Integer. En este caso, el compilador de Java realiza una promoción de tipo automática de int a double y llama al método.

Ejemplo 2: Intentemos escribir un código para verificar si la promoción de tipo automática ocurre de un tipo de datos de tamaño alto a un tipo de datos de tamaño pequeño. 

Java

class GFG {
   
    // A method that accept integer as parameter
    public static void method(int i)
    {
        System.out.println(
            "Automatic Type Promoted possible from high to small?");
    }
   
    public static void main(String[] args)
    {
        // method call with double as parameter
        method(2.02);
    }
}

Producción:

Mensaje de error

Explicación: a partir de este ejemplo, se demuestra que la promoción automática de tipos solo se aplica desde tipos de datos de tamaño pequeño a tipos de datos de tamaño grande. Como el tamaño doble es grande en comparación con el número entero, la conversión de tamaño grande a tamaño pequeño falla.

Ejemplo 3: En este ejemplo, vamos a ver los métodos sobrecargados y cómo está ocurriendo allí el tipo de promoción automática. 

Java

class GFG {
   
    // A method that accept integer as parameter
    public static void method(int i)
    {
        System.out.println(
            "Automatic Type Promoted to Integer-" + i);
    }
   
    // A method that accept double as parameter
    public static void method(double d)
    {
        System.out.println(
            "Automatic Type Promoted to Double-" + d);
    }
   
    // A method that accept object as parameter
    public static void method(Object o)
    {
        System.out.println("Object method called");
    }
   
    public static void main(String[] args)
    {
        // method call with char as parameter
        method('a');
       
        // method call with int as parameter
        method(2);
       
        // method call with float as parameter
        method(2.0f);
       
        // method call with a string as parameter
        method("Geeks for Geeks");
    }
}
Producción

Automatic Type Promoted to Integer-97
Automatic Type Promoted to Integer-2
Automatic Type Promoted to Double-2.0
Object method called

Explicación: En el código anterior,  

  • Primero, llamamos a un método con un carácter como parámetro, pero no teníamos ningún método definido que acepte caracteres, por lo que verificará el siguiente tipo de datos de tamaño alto, es decir, Integer. Si hay un método que acepta Integer, realiza una promoción de tipo automática y llama a ese método. Si no lo encuentra, busca el tipo de datos de mayor tamaño del siguiente nivel.
  • Aquí tenemos un método que acepta números enteros, por lo que el carácter ‘a’ se convierte en un número entero-97 y se llama al método respectivo.
  • A continuación, llamamos a un método pasando dos variables enteras. Como encontró directamente un método, no se produjeron promociones y se llama al método.
  • A continuación, se pasa una variable flotante, es decir, 2.0f. Aquí tenemos un método que acepta el doble, por lo que el flotante se convierte en doble y se llama al método.
  • Finalmente, se pasa una string que ocupa más espacio en comparación con el doble. Por lo tanto, busca los métodos que aceptan una string u Objeto, que es una superclase de todo tipo. En este código, no hay un método que acepte strings, pero hay un método que acepta objetos. Entonces ese método se llama después de la promoción de tipos.

Ejemplo 4: en este ejemplo, considere los métodos sobrecargados con más de un argumento y observe cómo se produce aquí la conversión automática de tipos:

Java

class GFG {
   
    // overloaded methods
    // Method that accepts integer and double
    public static void method(int i, double d)
    {
        System.out.println("Integer-Double");
    }
    // Method that accepts double and integer
    public static void method(double d, int i)
    {
        System.out.println("Double-Integer");
    }
    public static void main(String[] args)
    {
        // method call by passing integer and double
        method(2, 2.0);
        // method call by passing double and integer
        method(2.0, 2);
        // method call by passing both integers
        // method(2, 2);
        // Ambiguous error
    }
}
Producción

Integer-Double
Double-Integer

Explicación: en el código anterior, cuando pasamos argumentos a una llamada de método, el compilador buscará el método correspondiente que acepte los mismos argumentos. Si está presente, llamará a ese método. De lo contrario, buscará escenarios para la promoción automática de tipos.

  • Para la primera llamada al método, ya existe un método que acepta argumentos similares, por lo que llamará a ese método Integer-Double.
  • Para la segunda llamada al método también hay un método definido en la clase, y el compilador llamará al método respectivo. (Entero doble)
  • Pero cuando pasamos 2 enteros como argumentos, el compilador primero busca un método respectivo que acepte 2 enteros. En este caso, no hay ningún método que acepte dos enteros. Por lo tanto, buscará escenarios para la promoción de tipos.
  • Aquí hay 2 métodos que aceptan un número entero y un doble y cualquiera de los números enteros puede promoverse a doble simplemente, pero el problema es la ambigüedad. El compilador no sabía a qué método llamar si se promocionaba el tipo. Entonces, el compilador arroja un mensaje de error como el que se especifica a continuación si descomentamos la línea 20 en el código anterior:

Error de ambigüedad

Estos son los pocos ejemplos que pueden dar una idea clara de la conversión automática de tipos en métodos sobrecargados.

Publicación traducida automáticamente

Artículo escrito por akhilvasabhaktula03 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *