Javaダイヤモンド演算子:Java 7以降でジェネリクスをシンプルに
Javaダイヤモンド演算子
ダイヤモンド演算子(`<>`, diamond operator)はJava 7で導入され、ジェネリクスのコード可読性を向上させました。ジェネリクスとは型引数の一種で、クラスメソッドで処理されるあらゆる種類のオブジェクトを渡せるようにします。例えば、Java 7より前で文字列のリストをArrayListオブジェクトでインスタンス化する場合、以下の構文が必要でした。
List<String> listOfStrings = new ArrayList<String>();
Java 7以降では、ダイヤモンド演算子を使って以下のように簡略化できます。
List<String> listOfStrings = new ArrayList<>();
ただし、匿名内部クラスでは使用できませんでした。例えば、Java 9より前では以下の構文でダイヤモンド演算子からオブジェクト型を省略できませんでした。
Handler<Integer> intHandler = new Handler<Integer>(1) { @Override public void handle() { System.out.println(content); } };
匿名クラスでのダイヤモンド演算子
Java 9では、ダイヤモンド演算子を匿名クラスでも使用できるようになり、コードの簡略化と可読性向上が図られました。
Handler<Integer> intHandler = new Handler<>(1) { @Override public void handle() { System.out.println(content); } };
Java 7、Java 8でのダイヤモンド演算子
以下の例では、ジェネリック引数を受け取る抽象クラスHandlerの匿名クラスを作成し、匿名クラス作成時にオブジェクト型を渡す必要がありました(渡さないとコンパイルエラーになります)。
例
public class Tester { public static void main(String[] args) { // 匿名クラスで1を処理 // Java 9以前ではダイヤモンド演算子に型引数を渡す必要あり // そうでないとコンパイラがエラーを出す Handler<Integer> intHandler = new Handler<Integer>(1) { @Override public void handle() { System.out.println(content); } }; intHandler.handle(); // 匿名クラスで2を処理 Handler<? extends Number> intHandler1 = new Handler<Number>(2) { @Override public void handle() { System.out.println(content); } }; intHandler1.handle(); Handler<?> handler = new Handler<Object>("test") { @Override public void handle() { System.out.println(content); } }; handler.handle(); } } abstract class Handler<T> { public T content; public Handler(T content) { this.content = content; } abstract void handle(); }
出力
上記プログラムをコンパイル・実行すると、以下の結果が得られます。
1 2 Test
Java 9以降のダイヤモンド演算子
Java 9以降では、以下のように匿名クラスでも`<>`演算子を使用できます。
例
以下の例では、ジェネリック引数を受け取る抽象クラスHandlerの匿名クラスを作成しますが、匿名クラス作成時にオブジェクト型を指定しません。コンパイラが型を自動推論します。
public class Tester { public static void main(String[] args) { // 匿名クラスで1を処理 // ダイヤモンド演算子に型引数を渡す必要なし // Java 9コンパイラが自動的に型を推論 Handler<Integer> intHandler = new Handler<>(1) { @Override public void handle() { System.out.println(content); } }; intHandler.handle(); Handler<? extends Number> intHandler1 = new Handler<>(2) { @Override public void handle() { System.out.println(content); } }; intHandler1.handle(); Handler<?> handler = new Handler<>("test") { @Override public void handle() { System.out.println(content); } }; handler.handle(); } } abstract class Handler<T> { public T content; public Handler(T content) { this.content = content; } abstract void handle(); }
出力
上記プログラムをコンパイル・実行すると、以下の結果が得られます。
1 2 Test
Java
- Javaプログラミング言語:進化、バージョン、応用分野
- Javaアクセス修飾子の完全ガイド:種類、ルール、実践例
- Java while & do-whileループをマスター:ステップバイステップチュートリアル
- Java NavigableSetインターフェースをマスター:ナビゲーション、ソート、実践例
- Java 乱数生成:Random クラスと Math.random 実践ガイド
- Java Characterラッパークラス:charオブジェクト操作をマスター
- Javaで挿入ソート:わかりやすい例とステップバイステップガイド
- Java開発環境構築ガイド:インストールとパス設定
- Java 10の時間ベースリリースバージョニング:予測可能な半年ごとのアップデート
- Javaシングルトンパターン完全解説:安全な実装と活用法
- Javaクラスとオブジェクト:実践ガイド