Tomé este fragmento de código de alguna prueba, usando IDE, lo ejecuté y obtuve un resultado largo, largo, pero la respuesta correcta es Byte, Byte , ¿por qué obtuve un resultado diferente? La pregunta está relacionada con JDK 11
public class Client {
static void doCalc(byte... a) {
System.out.print("byte...");
}
static void doCalc(long a, long b) {
System.out.print("long, long");
}
static void doCalc(Byte s1, Byte s2) {
System.out.print("Byte, Byte");
}
public static void main(String[] args) {
byte b = 5;
doCalc(b, b);
}
}
EDITADO:
El código se tomó aquí: Descripción general de la certificación de Oracle y preguntas de muestra (Página: 13, Pregunta: 5)
Byte b = 5;
con un capital B.long, long
en Java8 también FYI ... No estoy seguro de por qué para ser honesto, esperando una respuesta también :)Respuestas:
Por lo tanto, si se va por el lenguaje Java especificación para la determinación de método de firma en tiempo de compilación será claro:
Entonces, de los pasos anteriores, está claro que en su caso en la primera fase, el compilador de Java encontrará un método de coincidencia que sí lo hace
doCalc(long a,long b)
. Su métododoCalc(Byte s1, Byte s2)
necesita un autoboxing durante la llamada, por lo que tendrá menos preferencia.fuente
long
aceptabyte
, parece seguir una conversión primitiva cada vez mayor : docs.oracle.com/javase/specs/jls/se7/html/jls-5.html#jls-5.1.2 . Básicamente,+widening -boxing -varargs
entonces ,+widening +boxing -varargs
entonces+widening +boxing +varargs
.Byte, Byte
?Lea el capítulo de JLS sobre conversiones .
Lo que sucede en su caso es que durante el tiempo de ejecución, JVM elige realizar una conversión de ampliación,
byte -> long
ya que esta conversión es más segura porque se garantiza que no causaRuntimeException
.La conversión de
byte
aByte
también llamado boxing puede resultar en OutOfMemoryError ya que la JVM tiene que asignar nuevos objetos al montón:Por eso, se prefiere la
byte -> long
conversión de ampliación más segura .fuente
byte
aByte
nunca causaOutOfMemoryException
, ya que todos los valores deByte
(-128-127) se almacenan en caché internamente. Pero puede no ser lo mismo con otros tipos, por lo que, como regla general, la ampliación de la conversión tiene prioridad.Para encontrar la sobrecarga correcta, el orden es:
Entonces
b
donde unByte
resultado seríaByte, Byte
.new byte[] { b, b }
el resultado seríabyte, byte
.long, long
.Byte, Byte
resulta.fuente