是的,当您需要处理已擦除泛型和类型标记的交集时。
假设您想要一个在编译时和运行时都是类型安全的通用函数。所以你用类型标记声明它:
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
直接转换为(虚构的)类型Class<List<String>>
,我无法告诉你。我希望 Java 在未来的某个时候能够具体化泛型类型。然后List<String>.class
将是一个有效的类型标记,并且您不需要任何转换,更不用说奇怪的双重原始到假通用转换了。