Java: преобразовать примитивный класс

есть ли в Java простой процесс преобразования примитивных объектов класса в объекты класса объектов? Учитывая класс Class cl, я хочу преобразовать его в класс, у которого нет примитивов. Например.

Class<?> cl = int.class;

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

cl == Integer.class

Мне нужен метод, который делает это для всех примитивных типов. Очевидно, я мог перебирать все примитивные типы, но я думал, что кто-то может знать о лучшем решении.

Cheers, Макс

Ответы

Ответ 1

Надеюсь, я понял это правильно. В основном вам требуется сопоставление от примитивных типов классов к их методам обёртки.

Статический метод утилиты, реализованный в некотором классе Utility, был бы изящным решением, потому что вы использовали бы преобразование следующим образом:

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

В качестве альтернативы, объявить и заполнить статическую карту:

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

Ответ 2

org.apache.commons.lang.ClassUtils.primitiveToWrapper(класс)

Ответ 3

В качестве альтернативы, если вы используете Guava, он имеет Класс примитивов, который вы можете использовать следующим образом:

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

Ответ 4

Оба Guava и Apache Commons используют базовый HashMap<Class<?>, Class<?>>, который действительно не нужен, но делает его доступным для чтения.

Следующий оптимизированный über-фрагмент выполняет те же функции в постоянное время, поскольку он сопоставляет класс Wrapper с помощью индекса поиска:

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];
}

В игре есть немного кода для гольфа, поэтому не переупорядочивайте классы, если вы не знаете, что делаете;)