2012-03-30 6 views
5

Capisco cosa sono i wrapper, ma dalla documentazione sembra di poter ottenere un'istanza di un oggetto Classe di tipo int. Questo restituisce il wrapper o una sorta di istanza di classe di int? Perché non avrebbe senso se lo facesse, a causa dei generici e della cancellazione dei caratteri. Non è vero che puoi ottenere solo istanze di classi di classi reali non primitive? Quando dicono rappresentano significano wrapper di qualcos'altro?Cosa restituisce int.class

Ecco cosa dice il JavaDoc, e perché sono confuso

TYPE 

public static final Class TYPE 

    The Class instance representing the primitive type int. 

    Since: 
     JDK1.1 
+1

io non seguono la logica del "a causa di farmaci generici e la cancellazione di tipo ... non è vero che puoi ottenere solo istanze di Class 'di classi effettive [e] non primitive? " La cancellazione generica e di tipo non ha nulla a che fare con la differenza tra classi e primitive. –

+1

Ti piacerà 'void.class' :-) – Thilo

risposta

7

Non è forse vero che si può ottenere solo le istanze di classe di non classi veri primitivi?

o meno.

Ma a volte è necessario disporre di alcuni meta-dati per "integer primitivo". Per esempio guardando la firma del metodo. Quindi si ottiene un valore Class[] per i parametri e in qualche modo è necessario distinguere tra public void test(Integer x) e public void test(int x).

in modo da facilitare questo, ci sono casi di classe speciale per i tipi primitivi.

a prendere questo un ulteriore passo avanti, c'è anche java.lang.Void.TYPE:

Class<Void> x = void.class; 

Ipocrisia Javadoc:

/** 
* Determines if the specified <code>Class</code> object represents a 
* primitive type. 
* 
* <p> There are nine predefined <code>Class</code> objects to represent 
* the eight primitive types and void. These are created by the Java 
* Virtual Machine, and have the same names as the primitive types that 
* they represent, namely <code>boolean</code>, <code>byte</code>, 
* <code>char</code>, <code>short</code>, <code>int</code>, 
* <code>long</code>, <code>float</code>, and <code>double</code>. 
* 
* <p> These objects may only be accessed via the following public static 
* final variables, and are the only <code>Class</code> objects for which 
* this method returns <code>true</code>. 
* 
* @return true if and only if this class represents a primitive type 
* 
* @see  java.lang.Boolean#TYPE 
* @see  java.lang.Character#TYPE 
* @see  java.lang.Byte#TYPE 
* @see  java.lang.Short#TYPE 
* @see  java.lang.Integer#TYPE 
* @see  java.lang.Long#TYPE 
* @see  java.lang.Float#TYPE 
* @see  java.lang.Double#TYPE 
* @see  java.lang.Void#TYPE 
* @since JDK1.1 
*/ 
public native boolean isPrimitive(); 
+2

A volte devi fare attenzione anche a questi tipi di classi speciali. Una volta stavo scrivendo del codice dove ho chiamato .getSuperclass() pensando che sarei andato bene, perché tutto proviene da un oggetto, giusto? No. – xxpor

+0

Trovo interessante il fatto che 'Integer.TYPE' sia dichiarato come' Classe 'invece di una' Classe '- sembra leggermente errato. –

Problemi correlati