Peguei esse trecho de código de algum teste, usando o IDE, executei-o e obtive um resultado obtive longo, longo, mas a resposta correta é Byte, Byte , por que obtive resultados diferentes? A questão está relacionada ao 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:
O código foi obtido aqui: Visão geral da certificação Oracle e perguntas de exemplo (Página: 13, Pergunta: 5)
Byte b = 5;
com um capital B.long, long
em Java8 também FYI ... Não sei por que, para ser honesto, à espera de uma resposta também :)Respostas:
Portanto, se você examinar a especificação da linguagem Java para determinar a assinatura do método no momento da compilação, ficará claro:
Portanto, a partir das etapas acima, é claro que, no seu caso, na primeira fase, o compilador Java encontrará um método correspondente
doCalc(long a,long b)
. Seu métododoCalc(Byte s1, Byte s2)
precisa de uma caixa automática durante a chamada para obter menos preferência.fonte
long
aceitabyte
, parece seguir uma conversão primitiva cada vez maior : docs.oracle.com/javase/specs/jls/se7/html/jls-5.html#jls-5.1.2 . Então, basicamente,+widening -boxing -varargs
em seguida,+widening +boxing -varargs
em seguida+widening +boxing +varargs
.Byte, Byte
?Leia o capítulo JLS sobre conversões .
O que está acontecendo no seu caso é que, durante o tempo de execução, a JVM opta por executar uma conversão ampliada,
byte -> long
pois essa conversão é mais segura porque é garantido que não causaRuntimeException
.A conversão de
byte
paraByte
também chamado de boxe pode resultar em OutOfMemoryError, pois a JVM precisa alocar novos objetos no heap:Por esse
byte -> long
motivo, é preferível a conversão de alargamento mais segura .fonte
byte
paraByte
nunca causaOutOfMemoryException
, pois todos os valores deByte
(-128 - 127) são armazenados em cache internamente. Mas pode não ser o mesmo com outros tipos, portanto, como regra geral, o aumento da conversão ganha prioridade.Para encontrar a sobrecarga correta, o pedido é:
assim
b
onde umByte
resultado seriaByte, Byte
.new byte[] { b, b }
o resultado seriabyte, byte
.long, long
.Byte, Byte
resulta.fonte