2016-09-12 5 views
-1

stoße ich auf diesem Code, und ich bin verwirrt, warum ternärer Operator auf diese Weise verhalten, (ich habe nicht genau die gleiche Frage auf Stackoverflow finden, so mit mir tragen)ternärer Operator und primitive Typen

a Haben Blick auf diesem Code

public class TernaryOperatorTester{ 
public static void main(String []args){ 
    Integer i1 = 8; 
    Integer i2 = 8; 
    byte b1 = 3; //OK 
    byte b2 = 5 + 4; //OK 
    byte b3 = i1 == i2 ? 4 : 8; //KO! 
    byte b4 = i1 == i2 ? (byte)4 : 8; //OK!!, else part do not need cast! 
    short s1 = i1 == i2 ? 4 : 8; //KO! similarly 
    short s2 = i1 == i2 ? (short)4 : 8;//OK!!,and again else part do not need cast! 
    } 
} 

ersten, was in dem ternären Operator zurückgegeben wird, ist wörtlicher Wert (es ist nicht ein Ausdruck ist, dass in einem int oder anderen größeren Datentypen gefördert wird), - wie b1 und b2 , warum ist b3 nicht mit Literalwert OK?

Sekunde, auch wenn es eine Erklärung für b3 gibt, warum b4 ist OK ohne in den sonst Teil des Ausdrucks zu werfen?

Ich habe ein anderes Beispiel mit kurzen Datentyp, der das gleiche Verhalten hat.

dank

+3

https://docs.oracle.com/javase/specs/jls/se8/html/jls-15.html#jls-15.25 – GriffeyDog

+1

Obwohl es kein genaues Duplikat ist, siehe http://stackoverflow.com/questions/12332574 –

+0

beide sind nicht doppelt! Ich nehme hier nicht das Auto-Boxen. – LeTex

Antwort

0

Der ternäre Operator ist die Bestimmung seiner Rückgabetypen auf der Grundlage der „if“ und „else“ Werte. Wenn es eine "4" als "If" -Wert sieht, nimmt es an, dass es einen Int-Typ zurückgibt. Wenn "4" als Byte umgewandelt wird, weiß der ternäre Operator, dass er einen Byte-Typ zurückgeben soll.

Sie müssen den Wert "else" nicht umsetzen, da der ternäre Operator den Rückgabetyp bereits kennt und der Wert "else" für den Typ passt.

+0

und warum brauchen wir keine Umwandlung, wenn wir zB b1 direkt Werte zuweisen? Der ternäre Operator gibt einen Literalwert zurück. – LeTex

0

Wie für b3 wird ein Integer einem Byte zugewiesen. Unboxing und enge primitive Konvertierung, gehen nicht implizit in die Hand.

Konvertieren Sie die Ganzzahl in ein int, es wird funktionieren oder geben Sie die Integer-Ganzzahl ein.