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