2017-10-25 2 views
3

Ich habe eine Frage über die Förderung von primitiven Typen in Java. Wie im folgenden Beispiel zu sehen ist, kompiliert eine der Methoden aufgrund eines Fehlers der Typenkonflikt nicht. Jede Methode gibt denselben Wert zurück, jedoch in unterschiedlichen Typen.Förderung von primitiven Typen

Die Version der primitiven long-Methode funktioniert ohne Fehler, während die Version der Wrapper-Klasse Long fehlschlägt. Dies liegt daran, dass das int Literal in der return-Anweisung zuerst zu einem breiteren primitiven Typ (z. B. long) und dann zur entsprechenden Wrapper-Klasse Integer und so weiter befördert wird. Da Integer keine Unterklasse von Long ist, gibt der Compiler einen Fehler aus.

Aber warum funktioniert die Version der Wrapper-Klasse Byte ohne Fehler? Was genau macht der Compiler zu diesem Zeitpunkt?

long getPrimitiveLong() { 
    return 12; // valid 
} 

Long getWrapperLong() { 
    return 12; // Error: type mismatch 
} 

Byte getWrapperByte() { 
    return 12; // valid 
} 
+0

Haben Sie 'return 12L;' für 'getWrapperLong' versucht? Es scheint für mich zu funktionieren. – OldCurmudgeon

+0

Ja, es funktioniert mit 12L oder (lang) 12. –

Antwort

5

Die Version mit Byte Arbeiten durch einige Compiler Magie.

Im Gegensatz long numerische Literale, die mit einem L Suffix, z. 12L gibt es keine byte Literal. Aus diesem Grund behandelt der Java-Compiler numerische Literale, die in ein Byte passen, als byte Literale. Daher wird 12 in Ihrem letzten Beispiel als eine Konstante des Typs byte betrachtet.

Java Language Specification bietet eine Beschreibung dieser Umwandlung in Abschnitt 5.2:

Eine Verengung von einer Box-Umwandlung gefolgt primitive Umwandlung kann verwendet werden, wenn der Typ der Variablen ist:

  • Byte und Der Wert des konstanten Ausdrucks ist im Typ byte darstellbar. Der Wert des konstanten Ausdrucks kann im Typ short dargestellt werden.
  • Character und der Wert des konstanten Ausdrucks ist im Typ char darstellbar.
2

Dies liegt daran, Java ermöglicht 1 Konvertierung oder Autoboxing, nicht mehr.

Java können alle diese tun:

int i = 5; 
double d = i; 
long l = i; 

Oder autobox:

Integer i = 5; 
Long l = 5L; 
Double d = 5.0; 

zweimal Konvertieren gibt Java eine harte Zeit.

0

Zahl wie 12 als int standardmäßig durch die Compiler betrachten, ist, warum der Fehler

Um dies zu beheben, dass Sie Casting für die Zeit nach dem Wert der langen variablen Byte und Ort L verwenden können.

lesen folgende Beitrag für mehr Details

http://javaseeeedu.blogspot.com/2015/12/casting-part-1.html

0

Als kurze Antwort - versuchen 12 mit 128 zu ersetzen (Byte in Bereich von -128 bis 127). Es wird nicht kompilieren, oder? Das Ergebnis hier ist, dass der Compiler über Byte-Grenzen weiß.

Für die eingehende Antwort können Sie einen tiefen Einblick in OpenJDK machen.

Verwandte Themen