2016-09-12 28 views
-1

私はこのコードで出くわす、と私は困惑していますが、(私はstackoverflowの上の正確な同じ質問を見つけられませんでしたので、私と一緒にクマ)三項演算子、なぜ三項演算子をこのように動作しているプリミティブ型

を持っています三項演算子で返されるもの

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! 
    } 
} 

最初にこのコードを、見て、リテラル値は、(それが表現はそれがintまたは他のより大きなデータ型に昇格されていない)である - ちょうどb1のように、とb2 、なぜb3はリテラル値でOKではないのですか?

第二に、b3の説明があるにもかかわらず、式のelse部分にキャストなしでb4が問題ないのはなぜですか?

私は短いデータ型の別の例を示しますが、これは同じ動作です。

おかげ

+3

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

+1

正確な複製はありませんが、http://stackoverflow.com/questionsをご覧ください。/12332574 –

+0

両方が重複していません!私はここでオートボクシングについては取っていません。 – LeTex

答えて

0

は、三項演算子は、「IF」と「それ以外」の値に基づいて、その戻り値の型を決定しています。 "if"値として "4"が見えるとき、それはint型を返すと仮定します。 "4"がバイトとしてキャストされている場合、3進演算子はバイト型を返す必要があることを認識します。

"else"値をキャストする必要はありません.3進演算子はすでに戻り値の型を認識しており、 "else"値は型に適合しているためです。

+0

と、なぜ値を直接b1に割り当てるときにキャストする必要がないのでしょうか?三項演算子はリテラル値を返しています。 – LeTex

0

b3については、整数がバイトに割り当てられています。アンボクシングと狭いプリミティブ変換は、暗黙のうちに手を携えてはいけません。

Integerをint型に変換すると、Integer型が動作するかそうでない場合は型変換されます。