2010-08-13 21 views
16

czy istnieje łatwa w języku Java konwertowanie prymitywnych obiektów klasy na obiekty klasy obiektów? Biorąc pod uwagę klasę cl klasy, chcę przekonwertować ją na klasę, która nie ma prymitywów. Na przykład.Java: Konwertuj prymitywną klasę

Class<?> cl = int.class; 

... 
if (cl.isPrimitive()) { 
    cl = Object of primitive 
} 
... 

cl == Integer.class

Chciałbym sposób, że robi to dla wszystkich typów pierwotnych. Oczywiście mogłem przeglądać wszystkie prymitywne typy, ale myślałem, że ktoś może wiedzieć o lepszym rozwiązaniu.

Cheers, Max

+1

Po prostu utwórz stałą mapy. Nie sądzę, że warto zająć się ośmioma sprawami. –

+0

Tak ... masz rację. Już to zrobiłem, po prostu pomyślałem, że może mi zabraknąć metody, która to zrobi dla mnie. – Max

Odpowiedz

22

Nadzieja zrozumiałem to dobrze. Zasadniczo potrzebujesz odwzorowania od prymitywnych typów klas do ich metod pakowania.

statyczna metoda narzędzie zaimplementowane w jakiejś klasie użytkowej byłoby eleganckie rozwiązanie, ponieważ byłoby użyć konwersji tak:

Class<?> wrapper = convertToWrapper(int.class); 

Alternatywnie zadeklarować i wypełnić statyczną mapę:

public final static Map<Class<?>, Class<?>> map = new HashMap<Class<?>, Class<?>>(); 
static { 
    map.put(boolean.class, Boolean.class); 
    map.put(byte.class, Byte.class); 
    map.put(short.class, Short.class); 
    map.put(char.class, Character.class); 
    map.put(int.class, Integer.class); 
    map.put(long.class, Long.class); 
    map.put(float.class, Float.class); 
    map.put(double.class, Double.class); 
} 

private Class<?> clazz = map.get(int.class); // usage 
+0

Tak, właśnie w ten sposób udało mi się to zrobić. Dziękuję za to. – Max

+2

zapomniałeś void.class. po prostu sayin ' –

11

org.apache.commons.lang.ClassUtils.primitiveToWrapper (klasa)

6

Ewentualnie, jeśli używasz Guava, ma Primitives class, whi ch można użyć tak:

Primitives.wrap(int.class); //returns Class<Integer> 
Primitives.wrap(Integer.class); //returns Class<Integer> 
0

Zarówno Guava i Apache Commons użyć stanowiącego podstawę HashMap<Class<?>, Class<?>> co nie jest naprawdę konieczne, ale sprawia, że ​​kod readible. Realizacja

Poniższa über zoptymalizowane fragment wykonuje tę samą funkcjonalność w stałym czasie, gdyż mapy do klasy otoki pośrednictwem odnośnika indeksu:

private static final Class[] wrappers = { 
     Integer.class, 
     Double.class, 
     Byte.class, 
     Boolean.class, 
     Character.class, 
     Void.class, 
     Short.class, 
     Float.class, 
     Long.class 
}; 

@SuppressWarnings("unchecked") 
public static <T> Class<T> wrap(final Class<T> clazz) { 
    if (!clazz.isPrimitive()) return clazz; 
    final String name = clazz.getName(); 
    final int c0 = name.charAt(0); 
    final int c2 = name.charAt(2); 
    final int mapper = (c0 + c0 + c0 + 5) & (118 - c2); 
    return (Class<T>) wrappers[mapper]; 
} 

W grę wchodzi trochę kodu golfowego, więc nie zmieniaj kolejności lekcji, chyba że wiesz co. robisz;)

+0

Czy możesz wyjaśnić istotę działania algorytmu? – luckydonald

+0

Używa dwóch liter rzeczywistych nazw klas w celu wykonania bardzo ograniczonego wyszukiwania indeksu. Ten sam algorytm będzie działał również przy konwertowaniu wrapperów na prymitywy, jedyną różnicą jest to, że zamiast tego musisz wyszukać litery 10 i 12 (prefiks java.lang.). Oto kilka dodatkowych kodów wraz z testami jednostkowymi: – melezov