関数ジェネリックスとリフレクションを組み合わせると、柔軟でスケーラブルなコードが作成されます。関数型ジェネリックスはパラメーター化された型をサポートしますが、リフレクションによりクラスとフィールドに関するメタデータを取得できます。この 2 つを組み合わせることで、異なる型のパラメーターを受け入れる汎用関数を作成できます。型が実行時に決定される場合でも、リフレクションを使用してクラスとフィールドの情報を取得します。タイプ固有のコードを記述せずに、さまざまなオブジェクトタイプに柔軟な関数を作成します。
Java 関数ジェネリックスとリフレクションを組み合わせる
Java ジェネリックスを使用すると、パラメータ化された型を作成して、実行時に型を指定できるようになります。リフレクションを使用すると、クラス、メソッド、フィールドに関するメタデータを取得できます。これら 2 つの強力な機能を組み合わせることで、柔軟でスケーラブルなコードを作成できます。
関数ジェネリックを使用すると、さまざまな型のパラメーターを受け入れる関数を定義できます。たとえば、特定の型を宣言せずに 2 つの要素を交換する汎用関数を作成できます。
<T> void swap(T a, T b) { T temp = a; a = b; b = temp; }
Reflection を使用すると、クラス、メソッド、フィールドに関する実行時情報にアクセスできます。リフレクションを使用すると、次のことが可能になります。
関数ジェネリックとリフレクションを組み合わせることで、さまざまなオブジェクトタイプに柔軟で拡張可能なコードを作成できます。たとえば、型に関係なくオブジェクト値を文字列に変換する汎用関数を作成できます:
import java.lang.reflect.Field; public class ObjectToStringConverter { public static <T> String convertToString(T object) { StringBuilder sb = new StringBuilder(); Class<?> clazz = object.getClass(); // 获取所有字段 Field[] fields = clazz.getDeclaredFields(); // 遍历所有字段并追加其名称和值 for (Field field : fields) { try { field.setAccessible(true); sb.append(field.getName()).append(": ").append(field.get(object)).append("\n"); } catch (IllegalAccessException e) { e.printStackTrace(); } } return sb.toString(); } }
実用的な例:
型固有のコードを記述せずに、この関数をさまざまなオブジェクト型に使用できます:
// 创建一个 Person 类 class Person { private String name; private int age; // ... 构造函数和 getter/setter ... } // 创建一个 Book 类 class Book { private String title; private String author; // ... 构造函数和 getter/setter ... } // 测试 convertToString 函数 Person person = new Person("John", 30); Book book = new Book("Java Programming", "Author"); System.out.println(ObjectToStringConverter.convertToString(person)); System.out.println(ObjectToStringConverter.convertToString(book));
出力:
rree以上がJava 関数ジェネリックとリフレクションの組み合わせの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。