Ich habe dieses Code-Snippet aus einem Quiz genommen, es mit IDE ausgeführt und ein langes, langes Ergebnis erhalten , aber die richtige Antwort lautet Byte, Byte , warum habe ich ein anderes Ergebnis erhalten? Die Frage bezieht sich auf 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);
}
}
EDITIERT:
Der Code wurde hier aufgenommen: Oracle-Zertifizierungsübersicht und Beispielfragen (Seite: 13, Frage: 5)
Byte b = 5;
mit einer Hauptstadt B ist?long, long
auf Java8 FYI ... Ich bin mir nicht sicher, warum ich ehrlich sein soll und warte auch auf eine Antwort :)Antworten:
Also, wenn Sie die Java - Sprache durch Spezifikation Methodensignatur bei der Kompilierung zur Bestimmung klar sein wird:
Aus den obigen Schritten geht hervor, dass der Java-Compiler in Ihrem Fall in der ersten Phase eine passende Methode findet, die dies tut
doCalc(long a,long b)
. Ihre MethodedoCalc(Byte s1, Byte s2)
benötigt während des Aufrufs eine Autobox, damit sie weniger bevorzugt wird.quelle
long
Akzeptierenbyte
scheint eine sich erweiternde primitive Konvertierung zu folgen : docs.oracle.com/javase/specs/jls/se7/html/jls-5.html#jls-5.1.2 . Also im Grunde,+widening -boxing -varargs
dann+widening +boxing -varargs
dann+widening +boxing +varargs
.Byte, Byte
?Bitte lesen Sie das JLS-Kapitel über Conversions .
In Ihrem Fall führt JVM zur Laufzeit eine erweiterte Konvertierung durch,
byte -> long
da diese Konvertierung sicherer ist, da garantiert ist, dass dies keine Ursache istRuntimeException
.Das Konvertieren von
byte
inByte
auch als Boxing bezeichnet kann zu OutOfMemoryError führen, da die JVM dem Heap neue Objekte zuweisen muss:Aus diesem Grund wird die sicherere
byte -> long
Verbreiterung bevorzugt.quelle
byte
bisByte
nie verursachtOutOfMemoryException
, da alle Werte vonByte
(-128 - 127) intern zwischengespeichert werden. Bei anderen Typen ist dies jedoch möglicherweise nicht der Fall. Daher gilt als Faustregel, dass die Erweiterung der Konvertierung Vorrang hat.Um die richtige Überlastung zu finden, lautet die Reihenfolge:
Damit
b
wo einByte
das Ergebnis wäreByte, Byte
.new byte[] { b, b }
das Ergebnisbyte, byte
.long, long
.Byte, Byte
ergibt sich.quelle