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

时间:2011-08-16 18:16:39

标签: java reflection primitive-types boxing

让我们假设使用反射检索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);

2 个答案:

答案 0 :(得分:30)

基于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

这意味着如果我想知道我是在处理int还是Integer,我可以使用以下任何一种测试:

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

我缺少一个角落案件吗?如果是,请发表评论。

答案 1 :(得分:23)

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