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, longen 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
longaceptabyte, 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 -varargsentonces ,+widening +boxing -varargsentonces+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 -> longya que esta conversión es más segura porque se garantiza que no causaRuntimeException.La conversión de
byteaBytetambié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 -> longconversión de ampliación más segura .fuente
byteaBytenunca 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
bdonde unByteresultado seríaByte, Byte.new byte[] { b, b }el resultado seríabyte, byte.long, long.Byte, Byteresulta.fuente