为什么下面的代码会自动装箱到错误的类型并编译?

nwlls2ji  于 2021-07-05  发布在  Java
关注(0)|答案(1)|浏览(368)

这个问题在这里已经有答案了

为什么这个泛型java方法接受两个不同类型的对象(4个答案)
java泛型方法不工作-参数不受限制[重复](2个答案)
4个月前关门了。

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 ? 为什么允许这样的代码?

tjrkku2a

tjrkku2a1#

如果 i 被装在箱子里 Integer 以及 j 被装在箱子里 Long ,调用该方法仍然是合法的 test 其泛型类型假定为 java.lang.Number ,这是两者的超类型 Integer 以及 Long .
事实上,你可以打电话给你的朋友 test 方法,因为 T 可以作为基本类型 Object . 方法上的泛型根本不限制其参数。

相关问题