2010-08-13 63 views
16

在Java中如何輕鬆將原始類對象轉換爲對象類對象?給定一個類CL,我想把它轉換成一個沒有原語的類。例如。Java:轉換原始類

Class<?> cl = int.class; 

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

CL == Integer.class

我想這確實是一個方法,所有基本類型。很明顯,我可以遍歷所有基本類型,但我認爲有人可能知道更好的解決方案。

乾杯, 最大

+1

只需創建一個地圖常量。我認爲八宗案件不值得打擾。 – 2010-08-13 03:57:44

+0

是啊......你說得對。無論如何,已經這樣做了,只是以爲我可能會錯過一個方法,爲我做到這一點。 – Max 2010-08-13 05:39:42

回答

22

希望我的理解是正確的。基本上你需要從原始類類型到它們的包裝器方法的映射。

在一些實用類實現的靜態實用方法,將是一個完美的解決方案,因爲你會使用這樣的轉換:

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 
+0

是的,這幾乎是我最終做到的。感謝那。 – Max 2010-08-13 06:24:13

+2

你忘了void.class。只是在說' – 2015-10-14 18:45:38

11

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

6

或者,如果您使用的是Guava,它有Primitives class,whi CH您可以使用這樣的:

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

兩個番石榴和Apache共享使用底層HashMap<Class<?>, Class<?>>這是不是真的有必要,但爲使代碼readible。

以下黚優化片段執行在恆定的時間相同的功能,因爲它映射到經由索引查找一個包裝類:

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

有一點代碼高爾夫參與,所以不要重新排序類,除非你知道什麼喲你在做;)

+0

你能解釋算法的工作原理嗎? – luckydonald 2016-02-04 01:41:18

+0

它使用實際類名的兩個字母來執行非常有限的索引查找。相同的算法也可用於將包裝轉換爲基元,唯一的區別是您需要查找字母10和12(java.lang.prefix)。 下面是一些更多的代碼,與單元測試一起: https://github.com/melezov/runtime-bytegen/blob/master/src/main/java/org/revenj/Primitives.java – melezov 2016-02-05 02:16:16