En java int, float, etc., sont des types primitifs. Les classes wrapper sont utilisées au cas où nous aurions besoin de les utiliser avec des génériques. Mais toujours la déclaration suivante fonctionne en java,
Class intClass=int.class
Comment pouvons-nous appeler int.class
même s’il s’agit d’un type primitif?
Une primitive devenant un object
Pour les primitives, des objects de classe sont disponibles en tant que constantes nommées TYPE dans les classes wrapper correspondantes. En d’autres termes, int.class est remplacé par java.lang.Integer.TYPE. Pour les autres types, le compilateur crée une variable membre privée dans la classe en cours de compilation pour contenir l’object Class et génère le code permettant d’initialiser ce membre à l’aide de Class.forName ().
Trouvé une discussion
Et une belle discussion ici et votre exemple également couvert dans ce lien.
Quelques mots à partir de là:
Comment une classe peut-elle être une primitive? Confondons un peu plus les choses. Nous pouvons accéder à l’object Class représentant une classe définie en codant, par exemple:
Equation.class // returns the Equation Class object
Mais on peut aussi dire:
int.class
obtenir un object de classe dont le nom est “int”. Notez que nous n’avons pas envoyé la méthode getClass () à un object. nous avons utilisé le mot réservé pour un type primitif intégré (int) et, en utilisant la notation par points, avons accédé à sa classe “field”. Et cela retourne un object de classe!
int.class
est du même type que Class
conformément aux spécifications.
De docs :
Les types Java primitifs (boolean, octet, char, short, int, long, float et double) et le mot clé void sont également représentés sous forme d’objects Class.
À partir de JLS 15.8.2 :
15.8.2. Littéraux de classe
Un littéral de classe est une expression constituée du nom d’une classe, d’une interface, d’un tableau ou d’ un type primitif , ou du pseudo-type void, suivi d’un ‘.’ et la classe de jeton.
Le type de classe C., où C est le nom d’une classe, d’une interface ou d’un type de tableau, est la
Class
.Le type de p.class, où p est le nom d’un type primitif, est la
Class
, où B est le type d’une expression de type p après la conversion de boxe.Le type de void.class est
Class
.Il s’agit d’une erreur de compilation si le type nommé est une variable de type ou un type paramétré ou un tableau dont le type d’élément est une variable de type ou un type paramétré.
Il s’agit d’une erreur de compilation si le type nommé ne désigne pas un type accessible et de scope au point où apparaît le littéral de classe.
Un littéral de classe est évalué comme object Class pour le type nommé (ou pour void) tel que défini par le chargeur de classes qui définit la classe de l’instance actuelle.
Un littéral de classe est une expression constituée du nom d’une classe, d’une interface, d’un tableau ou d’un type primitif, ou du pseudo-type void, suivi d’un `. ‘ et la classe de jeton.
représentés sous forme d’objects de classe.
So System.out.println(int.class);
va imprimer int
alors System.out.println(Integer.class);
affichera la class java.lang.Integer
.