class Test {
public static <T> boolean test(T a, T b) {
return a.equals(b);
}
public static void main(String[] args) {
int i = 0;
long j = 0;
if (!test(i, j)) {
throw new RuntimeException("i is not equal to j");
}
}
}
在上面的代码片段中,我预计会发生以下两件事之一:
将会出现编译器错误,因为
i
自动装箱为Integer
和j
自动装箱为Long
以及方法的声明test
要求其两个参数的类型相同。两者
i
和j
自动装箱为 Long 以及要编译和运行的代码显示i
和j
是平等的。
但实际发生的是 i
自动装箱为 Integer
和j
自动装箱为 Long
并且代码编译没有错误。这和test
的声明不矛盾吗? ?允许这样的代码的原因是什么?
最佳答案
如果i
装箱为Integer
并且j
装箱为Long
,那么仍然合法调用方法 test
,其泛型类型假定为 java.lang.Number
,它是 Integer
和 Long
的父类(super class)型。
事实上,您可以使用任意两个对象调用您的test
方法,因为T
可以作为基本类型对象
。该方法的泛型根本不限制其参数。
关于java - 为什么以下代码会自动装箱为错误的类型并进行编译?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63725238/