工業製造
産業用モノのインターネット | 工業材料 | 機器のメンテナンスと修理 | 産業プログラミング |
home  MfgRobots >> 工業製造 >  >> Industrial programming >> Java

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

  1. Javaプログラミング言語:進化、バージョン、応用分野
  2. Javaアクセス修飾子の完全ガイド:種類、ルール、実践例
  3. Java while & do-whileループをマスター:ステップバイステップチュートリアル
  4. Java NavigableSetインターフェースをマスター:ナビゲーション、ソート、実践例
  5. Java 乱数生成:Random クラスと Math.random 実践ガイド
  6. Java Characterラッパークラス:charオブジェクト操作をマスター
  7. Javaで挿入ソート:わかりやすい例とステップバイステップガイド
  8. Java開発環境構築ガイド:インストールとパス設定
  9. Java 10の時間ベースリリースバージョニング:予測可能な半年ごとのアップデート
  10. Javaシングルトンパターン完全解説:安全な実装と活用法
  11. Javaクラスとオブジェクト:実践ガイド