違いは何ですか Integer.class
、Integer.TYPE
およびint.class
?
私にacc
Integer.class
は、整数(ラッパー)クラスオブジェクトの参照です。int.class
as int
はクラスではなく、プリミティブ型です。そして、Integer.TYPE
参照する?Java.lang.Class.isPrimitive
APIから
8つのプリミティブ型とvoidを表す9つの定義済みClassオブジェクトがあります。これらはJava Virtual Machineによって作成され、それらが表すプリミティブ型と同じ名前、つまりブール、バイト、char、short、int、long、float、doubleを持っています。
これらのオブジェクトには、次のパブリック静的最終変数Java.lang.Boolean.TYPE
、Java.lang.Integer.TYPE
などを介してのみアクセスできます。
_Integer.class
_は、あなたが言うように、Class
型のInteger
オブジェクトへの参照です。
_int.class
_は、類似性であり、Class
型のint
オブジェクトへの参照です。これは正しく聞こえないというのは正しいことです。プリミティブにはすべて、特殊なケースとしてClass
オブジェクトがあります。 foo(Integer value)
とfoo(int value)
の違いを知りたい場合、リフレクションに役立ちます。
_Integer.TYPE
_(_Integer.type
_ではなく、気にしてください)は_int.class
_の単なるショートカットです。
簡単なプログラムでこれを理解できます:
_public class IntClasses {
public static void main(String[] args) {
Class<Integer> a = int.class;
Class<Integer> b = Integer.TYPE;
Class<Integer> c = Integer.class;
System.out.println(System.identityHashCode(a));
System.out.println(System.identityHashCode(b));
System.out.println(System.identityHashCode(c));
}
}
_
出力例(毎回異なるが、最初の2つは常に同じであり、3つ目は事実上常に異なる):
_366712642
366712642
1829164700
_
わかりやすく言えば:
int->プリミティブです。簡単な数学演算用です。コレクションに追加することはできません。
整数->オブジェクト自体です。intのラッパーです。つまり、コレクションで使用できます(オブジェクトであるため)。 GCによって通常のオブジェクトとして収集されます。
編集:
public static void main(String[] args) {
int i = 5;
System.out.println(int.class);
Integer i1 = new Integer(5);
System.out.println(Integer.TYPE);
}
O/P : int
int
したがって、基本的に、両方ともintを返します。 Integer.TYPEは、Integerクラスのプリミティブ型を返すだけです。すべてのラッパークラスに当てはまります
Javaは、プリミティブごとに2つのタイプを定義することにより、プリミティブタイプとクラスタイプを統合失調症的な方法で処理します。
たとえば、int
はプリミティブ型で、Integer
はクラス型です。ジェネリックを使用する場合、非プリミティブ型を使用する必要があるため、_ArrayList<Integer>
_は許可されますが、_ArrayList<int>
_は許可されません。
リフレクションを実行したい場合があるため、この二重性は2つのクラスになります(他の方法でメソッドpublic int foo ();
を検査する方法)。
クラスがあるとしましょう:
_public class Foo {
private Integer value;
public int value1 () {
return value;
}
public Integer value2 () {
return value;
}
}
_
value2()
はnull
を返すことができ、value1()
はランタイムエラーをスローするため、2つのメソッドは常に同じ値を返すとは限りません。