2009-11-09 62 views
19

我有一段代码,我需要在方法中传递一个字段的类。由于我的代码的机制,我只能处理引用对象而不是基元。我想要一个简单的方法来确定Field的类型是否为原始类型,并将其与适当的包装类交换。所以在代码是我到目前为止做的是这样的:简单的方法来获取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); 

这工作得很好,除了一个事实,我需要显式地检查所有的基本类型,并与相应的包装类交换他们。现在我知道没有那么多的原始类型,简单地列出它们都不是问题,但我想知道是否有更简单更优雅的方式来完成它。

回答

33

我在我的答案中使用Google Collections Library,因为我被宠坏了,但如果你愿意,你可以看看如何用纯HashMaps做到这一点。

// 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(); 

很奇怪,JDK中没有任何东西存在,但事实上并没有什么。

编辑:我完全忘记,我们发布了这一点:

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

它包裹()方法,再加上展开()和其他一些偶然的事情。

+0

所以基本相同的东西...... :)谢谢你的答案。基本上目前没有别的办法。 – 2009-11-09 23:33:30

6

您可以调用class.isPrimitive()来知道它是否是一个原语,但是,没有装箱方法来转换JDK中的类。至少有一个open bug与此有关。

+0

包装类中还有一些字段可让您访问基本类(例如'Double.TYPE'与'double.class'相同),但是没有不可思议的方式来以编程方式利用它。 – 2017-04-20 19:13:31

5

这里,如果你并不需要高度优化的代码另一种方式:

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

还有com.sun.beans.finder.PrimitiveWrapperMap#的getType(primitiveName)。 但是,当然不推荐使用“com.sun”包中的类...

相关问题