Java
 Computer >> コンピューター >  >> プログラミング >> Java

Javaの条件演算子における数値プロモーションの仕組みを解説

条件演算子(? :)と数値プロモーションとは

Javaの条件演算子(三項演算子とも呼ばれます)は、1つのブール値(boolean)の評価結果に基づいて、次にどちらの式を評価するかを決定します。一見シンプルな構文ですが、第2・第3オペランドの型が異なる場合には「二項数値プロモーション(binary numeric promotion)」が適用されるため、意図しない結果になることがあります。

まず、条件演算子を使った具体例を見てみましょう。

サンプルコード:条件演算子を使用した場合

import java.io.*;
public class Demo{
    public static void main (String[] args){
        Object my_obj = true ? new Integer(91) : new Float(89);
        System.out.println(my_obj);
    }
}

実行結果

91.0

このプログラムでは、Demoクラスのmainメソッド内でObject型の変数my_objを定義しています。条件がtrueのため、本来であればInteger型の91が出力されそうに思えます。しかし、実際の出力は「91.0」となります。

これは、条件演算子の第2オペランド(Integer)と第3オペランド(Float)の型が異なるため、Javaコンパイラが自動的に二項数値プロモーションを適用し、両方の式がFloat型として統一されるからです。その結果、整数値91は浮動小数点数の91.0に変換されて出力されます。

if-else文を使用した場合との比較

次に、プロモーションが発生しない書き方を見てみましょう。同じ処理をif-else文で記述すると、挙動が変わります。

サンプルコード:if-else文を使用した場合

import java.io.*;
public class Demo{
    public static void main (String[] args){
        Object obj_2;
        if (true)
            obj_2 = new Integer(91);
        else
            obj_2 = new Float(89);
        System.out.println(obj_2);
    }
}

実行結果

91

このプログラムでもDemoクラスのmainメソッド内でObject型の変数obj_2を定義しています。条件がtrueの場合にはInteger型の値が代入され、falseの場合にはFloat型の値が代入されます。そして、その結果がコンソールに出力されます。

今回は出力が「91」です。これは、if-else文では各代入文が独立して評価され、条件演算子のような共通の型への統一(プロモーション)が行われないためです。

まとめ

条件演算子とif-else文は似たような処理を実現できますが、オペランドの型が異なる場合の振る舞いが異なります。条件演算子では二項数値プロモーションにより結果の型が統一されるため、IntegerとFloatを混在させると予期せぬ浮動小数点表現になる可能性があります。この違いを理解しておくことで、バグの防止やより正確なコード設計につながります。

  1. Javaのclone()メソッドの重要性とは?シャローコピーとディープコピーの違いを徹底解説

    Javaにおけるclone()メソッドは、Cloneableインターフェースを実装したクラスのオブジェクトを複製(コピー)するために使用されます。デフォルトではフィールド単位のコピーが行われます。これは、Objectクラスが呼び出し元クラスの具体的なメンバー構成を知らないためです。そのため、クラスがプリミティブ型のメンバーのみを持つ場合は、新しいオブジェクトのコピーが作成され、その参照が返されます。しかし、クラスが参照型(クラス型)のメンバーを持つ場合には、オブジェクトへの参照だけがコピーされ、元のオブジェクトと複製されたオブジェクトの両方が同じインスタンスを指すことになります。また、Clon

  2. Javaのポリモーフィズム(多態性)とは?基本概念と具体例をわかりやすく解説

    ポリモーフィズム(多態性)とは ポリモーフィズム(多態性)とは、ひとつのオブジェクトが複数の形態(型)を持つことができる性質のことです。オブジェクト指向プログラミング(OOP)において最も一般的な活用場面は、親クラスの参照変数を使って子クラスのオブジェクトを参照するケースです。 すべてのJavaオブジェクトはポリモーフィック 複数のIS-Aテストに合格できるJavaオブジェクトは、ポリモーフィックであるとみなされます。Javaでは、あらゆるオブジェクトが「自分自身の型」に対するIS-Aテストと「Objectクラス」に対するIS-Aテストの両方に合格するため、すべてのJavaオブジェクトは本質