Java:转换基本类型类

17

在Java中有没有一种简单的方法将基本类型对象转换为对象类型对象?给定一个类Class cl,我想将它转换为一个不包含基本类型的类。例如。

Class<?> cl = int.class;

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

cl == Integer.class

我希望有一个方法能够适用于所有基本类型,当然我可以遍历所有基本类型,但我想知道是否有更好的解决方案。

谢谢, Max


1
只需创建一个映射常量。我认为八种情况不值得费心。 - Nikita Rybak
是的...你说得对。我已经这样做了,只是想着可能会错过一个可以为我完成这个任务的方法。 - Max
4个回答

23

希望我理解正确。基本上,您想要从原始类类型映射到其包装器方法。

在某个实用程序类中实现的静态实用程序方法将是一种优雅的解决方案,因为您可以像这样使用转换:

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

是的,那基本上就是我最终做出来的方法。谢谢你。 - Max
2
你忘记了 void.class。只是说一下。 - adapt-dev
或者稍微好一点 - Eugene

13

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


7

如果你使用的是Guava,那么它有一个基本类型类,你可以像这样使用:

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

1

Guava和Apache Commons都使用一个底层的HashMap<Class<?>, Class<?>>,虽然这并不是必要的,但可以使代码更易读。

下面这个高度优化的代码片段通过索引查找映射到一个包装器类,以恒定的时间执行相同的功能:

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

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


你能解释一下算法的本质工作原理吗? - luckydonald
它使用实际类名的两个字母来执行非常受限制的索引查找。相同的算法也适用于将包装器转换为基元,唯一的区别是您需要查找字母10和12(java.lang.前缀)。这里有更多的代码,以及单元测试: https://github.com/melezov/runtime-bytegen/blob/master/src/main/java/org/revenj/Primitives.java - melezov

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接