gpt4 book ai didi

java - 将 int.class 自动装箱到 Class

转载 作者:搜寻专家 更新时间:2023-10-30 19:54:58 25 4
gpt4 key购买 nike

我确定我的问题没有意义,但这是因为我不知道我看到了什么或如何描述它...

下面的代码可以正常编译,但不应该因为 intInteger 的类型不同.这不应该给出编译器错误吗?如果编译器期望 Class<Integer> 的类型它在运行时如何解析为 Class<int> ?这是编译器让它继续使用原语的魔法吗?如果编译器放宽对基元的验证,这不会导致方法编写者期望类型为精确类型的错误 Class<Integer>而是交付 Class<int> .

简而言之,为什么会编译并生成 correctwrong (取决于视角)运行时的结果。

public static void main(String[] args) {

printClass("int ", int.class);
printClass("Integer ", Integer.class);
System.out.printf("AreEqual", int.class == Integer.class);
}

private static void printClass(String text, final Class<Integer> klazz) {
System.out.printf("%s: %s%s", text, klazz, "\n");
}

输出:

int     : int
Integer : class java.lang.Integer
AreEqual: false

对于对照组,此代码执行NOT COMPILE正如我所料

public static void main(String[] args) {

printClass("Person ", Person.class);
printClass("Employee", Employee.class);
System.out.printf("AreEqual: %s", Person.class == Employee.class);
}

private static void printClass(String text, final Class<Person> klazz) {
System.out.printf("%s: %s%s", text, klazz, "\n");
}


public class Employee extends Person {
}
public class Person {
}

错误:

Error:(8, 40) java: incompatible types: java.lang.Class<com.company.Employee> cannot be converted to java.lang.Class<com.company.Person>

最佳答案

您观察到的是泛型处理原语方式的直接结果,它不是自动装箱。为了在使用类信息的情况下保持一致(如泛型或反射),在某些情况下,原始类型在检查其类型时需要返回一些东西。

当取消引用 anyprimitivetype.class 时,TYPE来自封闭包装类的字段将被返回。在您的情况下是:

 int.class -> public static final Class<Integer> TYPE

您可以在此处找到所有原始类型和 void 的完整列表: primitives

从 1.1 开始它们就是语言规范的一部分。

关于java - 将 int.class 自动装箱到 Class<Integer>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35741258/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com