Java:转换原始类

时间:2010-08-13 03:50:10

标签: java reflection class casting

有一个简单的Java可以将原始类对象转换为对象类对象吗?给定类Class cl,我想将它转换为没有原语的Class。例如

Class<?> cl = int.class;

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

cl == Integer.class

我想要一种为所有原始类型执行此操作的方法。显然我可以遍历所有原始类型,但我认为有人可能知道更好的解决方案。

干杯, 最大

4 个答案:

答案 0 :(得分:22)

希望我明白这一点。基本上,您需要从原始类类型到其包装器方法的映射。

在某些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

答案 1 :(得分:12)

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

答案 2 :(得分:7)

或者,如果您正在使用Guava,则它有Primitives class,您可以这样使用:

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

答案 3 :(得分:1)

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

涉及到一些高尔夫代码,所以除非你知道你在做什么,否则不要重新排序类。)