Quelle est la différence entre Integer.class
, Integer.TYPE
et int.class
?
acc à moi
Integer.class
est une référence à un objet de classe Integer (Wrapper)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 à?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
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
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
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.