web-dev-qa-db-ja.com

int.classはJavaのInteger.classまたはInteger.TYPEと等しいですか?

リフレクションを使用して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);
24

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

私が見逃しているコーナーケースはありますか?はいの場合はコメントしてください。

31

_int.class_は、_Integer.TYPE_にコンパイルされます。ただし、これはフィールドを宣言するクラスを表すClassオブジェクトを返すため、誤って Field.getDeclaringClass() を使用していると思います。使用したいのは Field.getType() です。

23
Paul Bellora