2015-11-11 2 views
9

Die folgende Codezeile durch den Compiler (sun-jdk-8u51) ohne Warnungen oder Fehler ist:Warum hat die Verengung Umwandlung von int zu kurz nicht, wenn lokale Variable in dem ternären Operator verwendet wird

short b = true ? 1 : 1; 

Während der nächsten zwei Codezeilen führen zu einem Übersetzungsfehler (inkompatible Typen: mögliche verlustbehaftete Umwandlung von int zu kurz):

boolean bool = true; 
short s = bool ? 1 : 1; 

Warum ist der Compiler nicht in der Lage die gleichen narrowing conversion des p auszuführen Rimitive Integer 1 im zweiten Fall?

+11

Dies liegt daran, im ersten Fall, da 'true' eine Kompilierung konstant ist, der ganze Ausdruck während der Kompilierung ausgewertet, so dass Sie im Grunde haben' kurze b = 1; ' während der Compiler in der zweiten Version nicht die Vereinfachung für Sie durchführt, daher der Fehler. – aioobe

+1

Zugehörig (möglicherweise dupe): http://stackoverflow.com/questions/4711431/unexpected-output-when-using-a-ternary-operator-and-final-variable – aioobe

+0

[Umsetzungskonvertierung] (http: // docs. oracle.com/javase/specs/jls/se8/html/jls-5.html#jls-5.2) - Wenn der Ausdruck ein konstanter Ausdruck ist ... kann die verengende primitive Konvertierung verwendet werden ... – ZhongYu

Antwort

3

Wie @aioobe in den Kommentaren beschrieben:

Dies liegt daran, im ersten Fall, da true eine Kompilierung konstant ist, wird der gesamte Ausdruck während der Kompilierung ausgewertet, so dass Sie im Grunde short b = 1; haben, während in der zweiten Version, wird der Compiler die Vereinfachung nicht für Sie tun, damit der Fehler

final auf die Deklaration der variablen bool Hinzufügen macht es eine konstante Größe, die auch der Compiler ermöglicht INTERPRE t den Code wie oben erwähnt.

final boolean bool = true; 
short s = bool ? 1 : 1; 

Siehe section 4.12.4

Verwandte Themen