web-dev-qa-db-ja.com

Integer.classとint.class

違いは何ですか Integer.classInteger.TYPEおよびint.class

私にacc

  1. Integer.classは、整数(ラッパー)クラスオブジェクトの参照です。
  2. しかし、それではint.class as intはクラスではなく、プリミティブ型です。そして、Integer.TYPE 参照する?
30
user3380123

Java.lang.Class.isPrimitive AP​​Iから

8つのプリミティブ型とvoidを表す9つの定義済みClassオブジェクトがあります。これらはJava Virtual Machineによって作成され、それらが表すプリミティブ型と同じ名前、つまりブール、バイト、char、short、int、long、float、doubleを持っています。

これらのオブジェクトには、次のパブリック静的最終変数Java.lang.Boolean.TYPEJava.lang.Integer.TYPEなどを介してのみアクセスできます。

22

_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
_
29
yshavit

わかりやすく言えば:

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クラスのプリミティブ型を返すだけです。すべてのラッパークラスに当てはまります

3
TheLostMind

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つのメソッドは常に同じ値を返すとは限りません。

1