Die folgende Codezeile wird vom Compiler (sun-jdk-8u51) ohne Warnungen oder Fehler akzeptiert:
%Vor%Während die nächsten zwei Codezeilen zu einem Kompilierungsfehler führen ( inkompatible Typen: mögliche verlustbehaftete Konvertierung von int in kurz ):
%Vor%Warum ist der Compiler nicht in der Lage, dieselbe Engpasskonvertierung der primitiven Ganzzahl 1 im zweiten Fall?
Wie von @aioobe in den Kommentaren beschrieben:
Weil im ersten Fall
true
eine Kompilierzeitkonstante ist, wird der gesamte Ausdruck während der Kompilierzeit ausgewertet, also haben Sie grundsätzlichshort b = 1;
, während in der zweiten Version der Compiler die Vereinfachung nicht tut für dich, daher der Fehler
Das Hinzufügen von final
zur Deklaration der Variablen bool
macht es zu einer konstanten Variable, die es dem Compiler ermöglicht, den Code wie oben erwähnt zu interpretieren.
Siehe Abschnitt 4.12.4
Tags und Links java type-narrowing