Соответствует ли int.class Integer.class или Integer.TYPE в Java? - PullRequest
23 голосов
/ 16 августа 2011

Давайте представим, что можно получить декларирующий тип Field, используя отражение.

Какой из следующих тестов правильно покажет, имеет ли дело с int или Integer?

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 ]

30 голосов
/ 16 августа 2011

Исходя из 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 );

Есть ли угловой корпус, который я пропускаю?Если да, пожалуйста, прокомментируйте.

23 голосов
/ 16 августа 2011

int.class компилируется до Integer.TYPE. Тем не менее, я думаю, что вы используете Field.getDeclaringClass() неправильно, так как это возвращает объект Class, представляющий класс, который объявляет поле. То, что вы хотели бы использовать это Field.getType().

...