(T)a是未经检查的强制转换:由于
type erasure,运行时无法知道T是什么类型,因此它无法实际检查是否属于类型T.
执行此操作时,编译器会发出警告;在您的情况下,您通过编写@SuppressWarnings(“未选中”)来抑制该警告.
编辑添加(以回应下面评论中的进一步问题):
如果你想检查演员表,你可以这样写:
public class Test {
public void someGenericMethod(Class clazz, Integer a) {
T t = clazz.cast(a);
System.out.println(t);
System.out.println(t.getClass());
}
public static void main(String[] args) {
Test test = new Test();
// gives a ClassCastException at runtime:
test.someGenericMethod(BigDecimal.class, 42);
}
}
通过传递clazz,允许运行时检查强制转换;而且,更重要的是,您允许编译器从方法参数中推断出T,因此您不必再编写测试.< BigDecimal> someGenericMethod.
当然,调用该方法的代码仍然可以通过使用未经检查的强制转换来避免这种情况:
public static void main(String[] args) {
Test test = new Test();
Class clazz = Object.class;
test.someGenericMethod((Class) clazz, 42);
}
但那是主要的错,而不是某些GenericMethod. 🙂