RSS

Asignaciones – Sobrecarga de Métodos con Widening, Boxing y Clases Envoltorio

13 Oct

Vamos a ver algunos casos concretos relacionados con el Widening, las Clases Envoltorio y los Argumentos-Variables que pueden hacernos dudar en el momento de saber qué método elije el compilador cuando tenemos métodos sobrecargados…

Sobrecarga y tipos primitivos:

Escogerá el menor tipo que sea mayor que el argumento en la llamada.

class SobrecargaPrimitivos {
    public static void main(String[] args){

        byte byteVar = 10;
        short shortVar = 10;
        char charVar = 10;
        long longVar = 10;
        float floatVar = 10.0f;

        System.out.println ("\nmetodo (byteVar)\u003B");
        metodo (byteVar); //Llamada con un argumento byte

        System.out.println ("\nmetodo (shortVar)\u003B");
        metodo (shortVar); //Llamada con argumento short

        System.out.println ("\nmetodo (charVar)\u003B");
        metodo (charVar); //Llamada con argumento char

        System.out.println ("\nmetodo (longVar)\u003B");
        metodo (longVar); //Llamada con argumento long

        System.out.println ("\nmetodo (floatVar)\u003B");
        metodo (floatVar); //Llamada con argumento float

    }

 static void metodo (int v) { System.out.print ("-> amplia a int y ejecuta metodo (int v) \n");}
 static void metodo (long v) { System.out.print ("-> amplia a long y ejecuta metodo (long v) \n");}
 static void metodo (double v){System.out.print ("-> amplia a double y ejecuta metodo (double v)\n");}

}

Sobrecarga Boxing y tipos primitivos:

Si el compilador tiene que elegir entre hacer un boxing (un método con un parámetro Envoltorio) y un widening (método con un tipo primitivo mayor) elegirá el widening.

class SobrecargaBoxing_Primitivos {
    public static void main (String[] args){
        int intVar = 10;
        System.out.println ("\nmetodo (intVar)\u003B");
        metodo (intVar); // A qué método llamará?
    }

   static void metodo (long v) { System.out.print ("-> amplia a long y ejecuta metodo (long v)\n");}
   static void metodo (Integer v) {System.out.print ("-> boxing a Integer y ejecuta metodo (Integer v)\n");}
}


Sobrecarga Argumentos-Variables y tipos primitivos:  

Si el compilador tiene que elegir entre un método con argumentos variables y un widening (método con un tipo primitivo mayor) elegirá el widening.

class SobrecargaVarArgs_Primitivos {

public static void main (String[] args){

int intVar = 10;

System.out.println ("\nmetodo (intVar)\u003B");
metodo (intVar);

}

 static void metodo (long v) { System.out.print ( "-> amplia a long y ejecuta metodo (long v) \n");}
 static void metodo (int ... v) {System.out.print ( "-> ejecuta metodo (int.. v) \n");}

}


Sobrecarga Boxing y Argumentos-Variables:

Cuando el compilador tiene que elegir entre hacer boxing y un método con argumentos variables, se queda con el boxing.

class SobrecargaBoxing_VarArgs {
public static void main (String[] args){
int intVar = 10;
System.out.println ("\nmetodo (intVar)\u003B");
        metodo (intVar);
}
static void metodo (Integer v) { System.out.print ( "-> boxing a Integer y ejecuta metodo (Integer v) \n");}
  static void metodo (int ... v) {System.out.print ( "-> ejecuta metodo (int.. v) \n");}
}


Sobrecarga y Tipos de Referencia:

El compilador hace widening si encuentra un objeto de una subclase y el método tiene como parámetro un objeto de la superclase. Esto es debido a que un objeto hijo se puede utilizar donde se espera un objeto padre y no al contrario.


Sobrecarga con widening y boxing a la vez:

Veamos qué ocurre en los casos en los que el compilador necesita hacer estas dos conversiones para llamar al método.

  • Amplía y luego Boxing: en este caso el compilador no puede hacer esta operación. Da error de compilación.
public class wideAndBox{
    public static void main(String[] args){
        byte byteVar = 5;
        System.out.println ("\nmetodo (byteVar)\u003B");
        metodo(byteVar);
    }
    static void metodo(Long v){
        System.out.println("-> ejecuta metodo (Long v) \n");
    }
}

El compilador tampoco puede hacer las operaciones cambiando el orden, primero Boxing y luego ampliando  porque un Byte no se puede ampliar a Long (Un Byte no es un Long, no están relacionados por herencia).

  • Boxing y luego amplía: el compilador sí puede hacer estas dos conversiones si despúes de hacer Boxing se puede ampliar porque estén relacionados por herencia. Un Byte es un Object.
public class BoxAndWide{
    public static void main(String[] args){
        byte byteVar = 5;
        System.out.println ("\nmetodo (byteVar)\u003B");
        metodo(byteVar);
    }
    static void metodo(Object  v){
        System.out.println("-> ejecuta metodo (Object v) \n");
    }
}


Combinando Boxing y Widening con VarArgs:

El compilador no tiene problema cuando un método tiene argumentos variables ya haga falta hacer widening o boxing.

public class ejem{

    public static void main(String[] args){
        int entero = 10;
        metodo1 (entero, entero);
        metodo2 (entero, entero);
    }

    static void metodo1(long... v) { System.out.println("metodo(Long... )");}
    static void metodo2(Integer... v) {System.out.println("metodo(Integer... )");}
}


Resumen:

  • Entre diferentes métodos con tipos primitivos, el compilador escoge el menor tipo que sea mayor al argumento de llamada.

En los tres siguientes casos gana la característica más antigua en Java:

  • Entre Boxing y Widening, gana Widening.
  • Entre Args Variables y Widening, gana Widening.
  • Entre Boxing y Argumentos Variables, gana Boxing.
  • Argumentos Variables con Boxing o Argumentos Variables con widening, ambos funcionan.
  • Widening y Boxing, no funciona (int pasaría a long, pero long no puede convertirse en Long).
  • Boxing y Widening, funciona (int pasaría a Integer e Integer puede convertirse en Object).
Anuncios
 
1 comentario

Publicado por en 13 octubre, 2011 en Estudio, Tema 3

 

Etiquetas: , , , , , , , ,

Una respuesta a “Asignaciones – Sobrecarga de Métodos con Widening, Boxing y Clases Envoltorio

  1. Sergio Ponce

    7 abril, 2013 at 4:08 am

    Hola Virginia,
    Me gustaría saber si es que rendiste la Certificación Business Component Developer, ya que me gustaría rendirla en Marzo del año 2014 y comenzar a prepararme desde ya.

    Si es que fuera así, me podrías donde puedo encontrar información útil para esta, gracias!

    Saludos desde Chile! =)

     

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

 
A %d blogueros les gusta esto: