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);
2
  • 14
    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. Commented Aug 16, 2011 at 18:40
  • 4
    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... +1 Commented May 22, 2013 at 13:43

2 Answers 2

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.

Sign up to request clarification or add additional context in comments.

2 Comments

And there are no corner cases missing, unless you count a field that is declared as Object and winds up storing an Integer
Oh yeah, and Integer extends Number, so there's another possible corner case if it matters.
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().

3 Comments

It would be more accurate to say that int.class points to Integer.TYPE
.class is a compile time construct. int.class gets compiled to a field access which loads Integer.TYPE.
@Antimony Interesting, I'd never looked at the bytecode. Edited and thanks.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.