2009-11-09 105 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」包中的類...