三次演算子の戻り値タイプ

5598 ワード

三次演算子の戻り値タイプ
この章では、Javaにおける3つの演算子の戻り値について説明します.
   ?    1 :    2 

まず、テストコードを見てみましょう.
System.out.println(true ? 1 : 3.14);  // out: 1.0

上記のコードは浮動小数点1.0を出力しているので、疑問に思うかもしれませんが、整数1を出力すべきではないでしょうか.
実際にはコンパイル時に、三目演算の戻り値タイプが決定され、trueまたはfalseと判断しても同じタイプを返すタイプしかありません.これはJavaのような方法では、1つのタイプのデータしか返されません.
上記のコードの戻り値1のタイプはintで、戻り値2のタイプはdoubleです.同じタイプを返すために、コンパイラは自動的に同じ親であるdouble(intタイプは自動的にdoubleにアップコンバートできます)を探し、最終的な戻り値タイプはdoubleです.
Object obj1 = true ? 1 : 3.14;
System.out.println(obj1 instanceof Integer); // false
System.out.println(obj1 instanceof Double);  // true

上のコードはこの考えを証明した.
その他のテスト例:
System.out.println(true ? 1 : 2);			// 1
System.out.println(true ? 1 : 2.0);			// 1.0
System.out.println(true ? 'a' : 2L);		// 97L
System.out.println(true ? 'a' : 2);			// a
System.out.println(true ? 'a' : Character.MAX_VALUE);		// a
System.out.println(true ? 'a' : Character.MAX_VALUE + 1);	// 97

まとめ:
  • 戻り値1と戻り値2が同じタイプである場合、3つの最終的な戻りタイプは、このタイプ
  • である.
  • 戻り値1と戻り値2が同じタイプでない場合、3つの最終的な戻りタイプは、2つのタイプの同じ最小親(最も近い親、ない場合はIntegerやStringなどのObjectを返します)です.
  • 基本データ型については、少し特殊です.1つの戻り値タイプがT(Tはbyte,charまたはshort)であり、もう1つがintの定数である場合、この定数がTの値範囲内であれば、3つの最終的な戻りタイプがTであり、定数値がTの値範囲内でなければ、自動タイプ変換が発生する(上記のテストコードの最後の4つから見ることができる).

  • まとめると、三目演算子は私たちが想像していたほど簡単ではありません.その中で、タイプ変換の「潜在規則」も底層を深く理解する必要があります.開発で三目演算子を使用する必要がある場合は、できるだけ戻り値を同じにしましょう.