はい、消去されたジェネリックと型トークンの共通部分を処理する必要がある場合。
コンパイル時と実行時の両方でタイプ セーフなジェネリック関数が必要だとします。したがって、型トークンで宣言します。
public static <T> T getT(
ExampleDataSource exampleDataSource,
String key,
Class<T> typeToken) {
// code goes here...
}
これは、データ ソースから非ジェネリック型のみを取得しようとする限り、うまく機能します。例えば:
String string = getT(source, "some-string", String.class);
int integer = getT(source, "some-integer", Integer.class);
DateTime dateTime = getT(source, "some-datetime", DateTime.class);
List<String>
しかし、データ ソースからデータを取得したい場合はどうなるでしょうか? まあ、その構文はかなり醜いダブルキャストです。また、キャストにもかかわらず、実行時に型トークンに存在しないため、消去された型をデータソースが独自に把握できる必要があります。
List<String> listOfString = getT(
source,
"some-list-of-strings",
(Class<List<String>>) (Class) List.class
);
Java がList.class
(架空の) 型への 1 つのステップでの直接のキャストを許可しない理由Class<List<String>>
は、私にはわかりませんでした。将来のある時点で、Java がジェネリック型を具体化することを願っています。次にList<String>.class
、有効な型トークンになり、キャストは必要ありません。生から偽のジェネリックへの奇妙な二重キャストはなおさらです。