在 Java 中,int.class 是否等于 Integer.class 或 Integer.TYPE?

2022-09-01 20:09:04

让我们想象一下,检索 using 反射的声明类型。Field

以下哪个测试将正确指示一个人是处理还是一个?intInteger

Field f = ...
Class<?> c = f.getDeclaringClass();
boolean isInteger;

isInteger = c.equals(Integer.class);
isInteger = c.equals(Integer.TYPE);
isInteger = c.equals(int.class);

isInteger = ( c == Integer.class);
isInteger = ( c == Integer.TYPE);
isInteger = ( c == int.class);

答案 1

基于(而不是),我得到以下内容:Field.getType()f.getDeclaringClass()

Type: java.lang.Integer

equals(Integer.class): true
equals(int.class)    : false
equals(Integer.TYPE) : false
== (Integer.class)   : true
== (int.class)       : false
== (Integer.TYPE)    : false

Type: int

equals(Integer.class): false
equals(int.class)    : true
equals(Integer.TYPE) : true
== (Integer.class)   : false
== (int.class)       : true
== (Integer.TYPE)    : true

Type: java.lang.Object

equals(Integer.class): false
equals(int.class)    : false
equals(Integer.TYPE) : false
== (Integer.class)   : false
== (int.class)       : false
== (Integer.TYPE)    : false

这意味着以下情况是正确的:

Integer.TYPE.equals(int.class)
Integer.TYPE == int.class

这意味着,如果我想了解我是否正在处理 一个 或 一个 ,我可以使用以下任何测试:intInteger

isInteger = c.equals(Integer.class) || c.equals(Integer.TYPE);
isInteger = c.equals(Integer.class) || c.equals(int.class);
isInteger = (c == Integer.class) || (c == Integer.TYPE);
isInteger = (c == Integer.class) || (c == int.class );

我错过了角落案例吗?如果是,请发表评论。


答案 2

int.class编译为 。但是,我认为您错误地使用了 Field.getDeclaringClass(),因为这会返回表示声明该字段的类的对象。你想用的是Field.getType()。Integer.TYPEClass