iberck
4/6/2018 - 1:37 AM

Casting en primitivos

Casting en primitivos

Widening - Ensanchamiento o conversión automática

int i = 3;
long l = i;

Narrowing - Reducción o conversión explicita

long l = 3;
int i = (int) l;

Un literal entero es de tipo long solo si termina con la letra L o l; de lo contrario es de tipo int

Type promotion in Expressions

Java automáticamente promueve cada operando byte, short o chart a int cuando se evalúa una expresión. Si un operador es long, float o double, la expresión entera es promovida a long, float o double respectivamente.

En el siguiente ejemplo es necesario hacer un cast porque la expresión (b*8) es promovida a int

byte b = 3;
byte b2 = (byte) (b*8);

Ambiguedades en métodos

Ambiguity in selecting from overloaded methods resolved in Java "the most specific one is chosen."

public class Test {

    void m(Object o) {
        System.out.println("object");
    }

    void m(int i) {
        System.out.println("primitive");
    }

    void m(Integer i) {
        System.out.println("Integer wrapper");
    }

//    void m(String s) {
//        System.out.println("Integer wrapper");
//    }
    
    public static void main(String[] args) {
        Test t = new Test();
        Object o = new Integer(2);

        t.m(4);
        t.m(new Integer(4));
        t.m(o);
        // Aquí el método más específico entre Object e Integer lo busca de abajo hacia arriba en la jerarquía
        t.m(null);
        
        // Si se agrega el método sobrecargado m con 1 argumento String, la línea anterior daría un error de compilación
        // porque sería ambiguo, no sabría si elegir entre Integer/String
    }
}