2015-11-11 10 views
9

Poniższa linia kodu jest akceptowane przez kompilator (sun-jdk-8u51) bez żadnych ostrzeżeń lub błędów:Dlaczego konwersja zwężenie z int na krótki nie działa, jeśli zmienna lokalna jest stosowany w trójskładnikowych operatora

short b = true ? 1 : 1; 

Zważywszy najbliższych dwóch linii kodu prowadzić do błędów kompilacji (niekompatybilnych typów: możliwy stratnej konwersji z int do krótkiego):

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

Dlaczego kompilator nie jest w stanie wykonać tę samą narrowing conversion z p liczbę całkowitą 1 w drugim przypadku?

+11

To dlatego, że w pierwszym przypadku, ponieważ 'TRUE to czas kompilacji stała, cała ekspresja jest oceniany podczas kompilacji, więc w zasadzie mają' krótkie B = 1; ' podczas gdy w drugiej wersji kompilator nie robi dla ciebie uproszczenia, stąd błąd. – aioobe

+1

Powiązane (prawdopodobnie dupe): http://stackoverflow.com/questions/4711431/unexpected-output-when-using-a-ternary-operator-i-final-variable – aioobe

+0

[conversion assignment] (http: // docs. oracle.com/javase/specs/jls/se8/html/jls-5.html#jls-5.2) - jeśli wyrażenie jest wyrażeniem stałym ... można użyć zwężającej się konwersji pierwotnej ... – ZhongYu

Odpowiedz

3

Jak zaznaczył @aioobe w komentarzach:

To dlatego, że w pierwszym przypadku, ponieważ true jest kompilacji czas stała, cała ekspresja jest oceniany podczas kompilacji, więc w zasadzie mają short b = 1;, natomiast w drugiej wersji, kompilator nie robi uproszczenia dla ciebie, stąd błąd

Dodawanie final do deklaracji zmiennej bool sprawia, że ​​stała zmienna, co pozwala także kompilator do Wykładnia t kod jak wspomniano powyżej.

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

Zobacz section 4.12.4

Powiązane problemy