Non tutte Class
oggetti rappresentano tipi classi/di riferimento; ci sono anche gli oggetti Class
che rappresentano i tipi primitivi. Ciò è utile perché nell'utilizzo della riflessione con campi e metodi, è spesso necessario specificare il loro tipo e può essere un tipo primitivo. Quindi, Class
viene utilizzato per rappresentare tutti questi tipi di pre-generici.
Tuttavia, molti dei metodi della classe Class
non hanno senso per i tipi primitivi. Ad esempio, è impossibile che un oggetto sia instanceof int
. Pertanto, il metodo analogo .isInstance()
restituirà sempre false
. Poiché il parametro di questo metodo è il tipo Object
, è semplicemente impossibile da un punto di vista linguistico per ciò che si passa in là per essere di un tipo primitivo.
Certo, in Java 5+ quando si passa un primitivo a un parametro di tipo Object
, esso subisce autoboxing, ma il fatto che ha subito autoboxing significa che ciò che è stato passato è in realtà un riferimento a un oggetto. I tipi di riferimento e i tipi primitivi sono distinti. Un parametro è un tipo di riferimento o di tipo primitivo. Quindi non puoi scrivere un metodo che possa prendere un "riferimento o primitivo".
Cosa si può chiedere, nel tuo esempio, è da rilevare che l'oggetto è stato autoboxed da un primitivo, e confrontarlo con un tipo primitivo. Tuttavia, è impossibile rilevare se il chiamante lo ha automaticamente disattivato, poiché l'autoboxing è un'operazione completamente eseguita sul lato chiamante che avviene prima della chiamata.
Tuttavia, supponendo che è stata autoboxed, si sa che tipo dovrebbe essere andato. Se ti aspetti un int
e viene autoboxato e passato al tuo metodo, dovrebbe essere un'istanza di Integer
.Quindi, quello che potresti fare è, quando clazz
rappresenta un tipo primitivo, invece di eseguire il controllo sulla sua classe wrapper. Pertanto, quando vede che clazz
è int.class
, sostituirlo con Integer.class
e quindi eseguire il controllo. Si noti che in questo modo continua a non sapere se ciò che è stato passato come il parametro o
è stato autoboxed.
Invece di usare tag non molto significativi come 'int',' types' o anche 'isintance', dovresti taggare la domanda con la lingua che stai usando. Ciò attirerebbe più spettatori e quindi aumenta le possibilità di ricevere una risposta soddisfacente. –
Sry, l'ho completamente dimenticato. ... Immagino che java sia diventato naturale per me: D – mike
Hai letto [questa risposta] (http://stackoverflow.com/a/7083456/516433) ancora? – Lucas