java - 为什么以下代码会自动装箱为错误的类型并进行编译?

标签 java generics casting autoboxing

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");
        }
    }
}

在上面的代码片段中,我预计会发生以下两件事之一:

  1. 将会出现编译器错误,因为 i自动装箱为 Integerj自动装箱为 Long以及方法的声明test要求其两个参数的类型相同。

  2. 两者ij自动装箱为 Long 以及要编译和运行的代码显示 ij是平等的。

但实际发生的是 i自动装箱为 Integerj自动装箱为 Long并且代码编译没有错误。这和test的声明不矛盾吗? ?允许这样的代码的原因是什么?

最佳答案

如果i装箱为Integer并且j装箱为Long,那么仍然合法调用方法 test ,其泛型类型假定为 java.lang.Number ,它是 IntegerLong 的父类(super class)型。

事实上,您可以使用任意两个对象调用您的test方法,因为T可以作为基本类型对象。该方法的泛型根本不限制其参数。

关于java - 为什么以下代码会自动装箱为错误的类型并进行编译?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63725238/

相关文章:

Java 泛型调用返回 <T extends > 对象的方法

java - 2 个不同的 eclipse 安装是否使用不同的 JVM?

postgresql - 从 jsonb 记录数组中聚合数值(包括 NULL 值)

java - 对 List<Generic> 显式强制转换的怀疑

java - 在 BankAccount 项目中找不到 createAccount 符号

java - 泛型和静态方法

java - 如何在Scala中实现扩展Comparable且没有特定类型的Java接口(interface)?

c# - 如何在迭代时从通用列表中删除元素?

Android PreferenceManager.setDefaultValues() 因类转换异常而崩溃

java - 安装后复制可运行的jar