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