Does int.class equal Integer.class or Integer.TYPE in Java?
Asked Answered
D

2

24

Let's imagine one retrieves the declaring type of a Field using reflection.

Which of the following tests will correctly indicate whether one is dealing with an int or an 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);
Donnettedonni answered 16/8, 2011 at 18:16 Comment(2)
The issue with testing myself only is that there is a risk of missing a corner case. That's why I am asking the question.Spermophyte
JVersty is correct. Implementation and specification are different things. He want to know about specification which are more to hard then just run a piece of code... +1Hexastyle
D
31

Based on Field.getType() (instead of f.getDeclaringClass()), I get the following:

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

Meaning the following is true:

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

Meaning if I want to find out whether I am dealing with an int or an Integer, I can use any of the following tests:

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

Is there a corner case I am missing? If yes, please comment.

Donnettedonni answered 16/8, 2011 at 18:53 Comment(2)
And there are no corner cases missing, unless you count a field that is declared as Object and winds up storing an IntegerYoshida
Oh yeah, and Integer extends Number, so there's another possible corner case if it matters.Yoshida
Y
24

int.class compiles down to Integer.TYPE. However, I think you are using Field.getDeclaringClass() incorrectly, as this returns the Class object representing the class that declares the field. What you would want to use is Field.getType().

Yoshida answered 16/8, 2011 at 18:18 Comment(3)
It would be more accurate to say that int.class points to Integer.TYPEBangweulu
.class is a compile time construct. int.class gets compiled to a field access which loads Integer.TYPE.Bangweulu
@Bangweulu Interesting, I'd never looked at the bytecode. Edited and thanks.Yoshida

© 2022 - 2024 — McMap. All rights reserved.