2009-11-09 9 views
19

Ho un pezzo di codice in cui ho bisogno di passare la classe di un campo in un metodo. A causa della meccanica del mio codice, posso gestire solo oggetti di riferimento e non primitive. Voglio un modo semplice per determinare se il tipo di Field è primitivo e lo si scambia con la classe wrapper appropriata. Quindi, nel codice quello che faccio finora è qualcosa di simile:Un modo semplice per ottenere il tipo di classe wrapper in Java

Field f = getTheField(); // Dummy method that returns my Field 
Class<?> c = f.getType(); 
if (c == int.class) { 
    c = Integer.class; 
} 
else if (c == float.class) { 
    c = Float.class; 
} 
// etc 
myMethod(c); 

Questo funziona bene, tranne per il fatto che ho bisogno di controllare in modo esplicito per tutti i tipi primitivi e scambiarlo con la classe wrapper appropriata. Ora so che non ci sono molti tipi primitivi e non sarà un problema semplicemente elencarli tutti, ma mi chiedevo se esistesse un modo più semplice ed elegante di farlo.

risposta

33

Nella mia risposta utilizzo la Libreria di raccolte di Google, perché sono viziato in questo modo, ma probabilmente si può vedere come farlo con HashMaps semplici, se si preferisce.

// safe because both Long.class and long.class are of type Class<Long> 
    @SuppressWarnings("unchecked") 
    private static <T> Class<T> wrap(Class<T> c) { 
    return c.isPrimitive() ? (Class<T>) PRIMITIVES_TO_WRAPPERS.get(c) : c; 
    } 

    private static final Map<Class<?>, Class<?>> PRIMITIVES_TO_WRAPPERS 
    = new ImmutableMap.Builder<Class<?>, Class<?>>() 
     .put(boolean.class, Boolean.class) 
     .put(byte.class, Byte.class) 
     .put(char.class, Character.class) 
     .put(double.class, Double.class) 
     .put(float.class, Float.class) 
     .put(int.class, Integer.class) 
     .put(long.class, Long.class) 
     .put(short.class, Short.class) 
     .put(void.class, Void.class) 
     .build(); 

È strano che non esista nulla nel JDK per questo, ma in effetti non funziona.

EDIT: mi piacerebbe completamente dimenticato che abbiamo rilasciato questo:

http://google.github.io/guava/releases/21.0/api/docs/com/google/common/primitives/Primitives.html

Ha il metodo involucro(), oltre a scartare() e un paio di altre cose incidentali.

+0

Quindi praticamente la stessa cosa ... :) Grazie per la risposta. Fondamentalmente non c'è altro modo al momento. –

6

È possibile chiamare class.isPrimitive() per sapere se è un primitivo o no, tuttavia, non esiste un metodo di boxing per convertire le classi all'interno del JDK. C'è almeno uno open bug relativo a questo.

+0

Esistono anche campi nelle classi wrapper che consentono di accedere alle classi primitive (ad esempio, 'Double.TYPE' è lo stesso di 'double.class'), ma non esiste un modo non brutto di sfruttarlo a livello di programmazione. –

5

Ecco un altro modo, se non hai bisogno di codice altamente ottimizzato:

Class<?> primitive=long.class; 
    Class<?> boxed=Array.get(Array.newInstance(primitive,1),0).getClass(); 
    System.out.println(primitive.getName()); 
    System.out.println(boxed.getName()); 
0

C'è anche com.sun.beans.finder.PrimitiveWrapperMap # getType (primitiveName). Tuttavia, non è consigliabile utilizzare le classi del pacchetto "com.sun" ...

Problemi correlati