在编写处理表单数据的通用方法时,我遇到了以下(如我所见)意外行为。给定以下代码:
public class Test {
public <T> void someGenericMethod(Integer a) {
@SuppressWarnings("unchecked")
T t = (T) a;
System.out.println(t);
System.out.println(t.getClass());
}
public static void main(String[] args) {
Test test = new Test();
test.<BigDecimal>someGenericMethod(42);
}
}
ClassCastException
AFAIK,上面的代码应该在行中生成一个,T t = (T) a
因为 main 中的方法调用将参数化类型设置为,并且不允许BigDecimal
从 BigDecimal 强制转换,与我的预期相反,程序执行良好并打印了以下内容:Integer
42
class java.lang.Integer
事实上,如果我在方法签名中添加另一个参数(如String b
)并进行另一个分配T t2 = (T) b
,程序会打印
42
class java.lang.String
为什么t
变量将其类型更改为Integer
(无论如何,对类型 T 进行某种提升为 Object)?
欢迎对此行为进行任何解释