我有一个静态方法,它将根据类的类型返回自定义类型
public class GenericMethod {
public static <T> T returnGeneric(Class<T> clazz) {
return null;
}
}
现在,我想将一个带有泛型类型的类传递给它,
CustomType<String> type = GenericMethod.returnGeneric(CustomType.class);
唯一的问题是上述语句提供和取消选中转换警告。
我尝试了解决问题的解决方法new CustomType<String>().getName()
。
是否有正确的方法,或唯一的解决方案是使用@SuppressWarnings
?
答案 0 :(得分:1)
你想/想要尝试的是:
CustomType<String> type = GenericMethod.returnGeneric(CustomType<String>.class);
不幸的是,由于类型擦除,CustomType<A>.class
和CustomType<B>.class
之间没有区别,因此Java不支持此语法。
所以我的$ .02:你要求的是不可能的,所以请继续@suppresswarnings ......
答案 1 :(得分:1)
最好的方法是使用包装器方法并将所有警告放在一个位置。
术语“未选中”表示编译器没有足够的类型信息来执行确保类型安全所必需的所有类型检查。
答案 2 :(得分:0)
理论上,由于类型擦除,你不能这样做。
在实践中虽然;)你可以这样做,因为信息实际上在.class文件中。
我所知道的最简单的方法是using Spring's GenericTypeResolver
。
看看它。
答案 3 :(得分:0)
正如你所说@Simeon&#34;理论上你不能因为类型擦除而做到这一点&#34;。
仅当您具有CustomType
的子类时才能使用它:
class GenericMethod {
public static <T> T returnGeneric(Class<T> clazz) {
try {
return clazz.newInstance();
} catch (InstantiationException | IllegalAccessException e) {
e.printStackTrace();
}
return null;
}
public static void main(String [] args){
CustomeType<String> ct = returnGeneric(StringCustomeType.class);
System.out.println(ct);
}
}
class StringCustomeType extends CustomeType<String> {
}
class CustomeType<T> {
}