web-dev-qa-db-fra.com

Integer.class vs int.class

Quelle est la différence entre Integer.class, Integer.TYPE et int.class?

acc à moi

  1. Integer.class est une référence à un objet de classe Integer (Wrapper)
  2. mais qu'est-ce que int.class as int n'est pas une classe, c'est un type primitif. Et qu'est-ce que Integer.TYPE faire référence à?
30
user3380123

De Java.lang.Class.isPrimitive API

Il y a neuf objets Class prédéfinis pour représenter les huit types primitifs et void. Ceux-ci sont créés par la machine virtuelle Java, et portent les mêmes noms que les types primitifs qu'ils représentent, à savoir booléen, octet, char, court, int, long, flottant et double.

Ces objets ne sont accessibles que via les variables finales statiques publiques suivantes Java.lang.Boolean.TYPE, Java.lang.Integer.TYPE etc

22
Evgeniy Dorofeev

Integer.class Est, comme vous le dites, une référence à l'objet Class pour le type Integer.

int.class Est, par similitude, une référence à l'objet Class pour le type int. Vous avez raison, cela ne sonne pas bien; les primitives ont toutes un objet Class comme cas spécial. C'est utile pour la réflexion, si vous voulez faire la différence entre foo(Integer value) et foo(int value).

Integer.TYPE (Pas Integer.type, Je vous en prie) n'est qu'un raccourci pour int.class.

Vous pouvez vous en rendre compte avec un programme simple:

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

Exemple de sortie (ce sera différent à chaque fois, mais les deux premiers seront toujours les mêmes, et le troisième sera pratiquement toujours différent):

366712642
366712642
1829164700
29
yshavit

En termes simples:

int -> Sont des primitives ... pour des opérations mathématiques simples. Vous ne pouvez pas les ajouter à une collection.

Entier -> Sont des objets en eux-mêmes .. sont des wrappers pour les entiers. c'est-à-dire qu'ils peuvent être utilisés avec des collections (car ce sont des objets). Ils sont collectés comme objets normaux par le GC.

ÉDITER :

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

Donc, fondamentalement, les deux renvoient un int. Integer.TYPE renvoie simplement le type primitif de la classe Integer. C'est vrai pour n'importe quelle classe wrapper

3
TheLostMind

Java gère les types primitifs par rapport aux types de classe de manière schizophrénique en définissant deux types pour chaque primitive.

Par exemple, int est le type primitif et Integer le type de classe. Lorsque vous utilisez des génériques, vous êtes obligé d'utiliser un type non primitif, donc ArrayList<Integer> Est autorisé mais ArrayList<int> Non.

Puisque vous voulez parfois effectuer une réflexion, cette dualité se traduit par deux classes (comment pouvez-vous inspecter une méthode public int foo ();)?.

Disons que vous avez un cours:

public class Foo {

    private Integer value;

    public int value1 () {
        return value;
    }

    public Integer value2 () {
        return value;
    }

}

Les deux méthodes ne renverront pas toujours la même valeur, car value2() peut renvoyer null et value1() générera une erreur d'exécution.

1
Willem Van Onsem