2013-04-29 38 views
2

如何編寫一個函數,該函數返回給定類的默認值?如果一個類是其中一個原語,它應該返回一個包含默認值的包裝類,否則返回null。某個類的默認值

public <B> Object defaultValue(Class<B> clazz) { 
    return clazz.isPrimitive() ? ... : null; 
} 

所以對於int.class它應該返回Integer(0)

+0

你不能做一個單行(如果這是你想做的事)。 – 2013-04-29 15:55:07

+0

不一定是一條線。 – milan 2013-04-29 15:56:12

+2

爲每個可能的類別做出單獨的'if'情況。 – 2013-04-29 15:56:20

回答

3

如何編寫一個返回給定類的默認值的函數?如果一個類是其中一個原語,它應該返回一個包含默認值的包裝類,否則返回null。

所以我認爲對於像int.class元要返回new Integer(0),但讓說你想回到null對象。

如果這是真的,你可以使用數組在開始時填充默認值的事實。嘗試也許這樣

import java.lang.reflect.Array; 
... 

public static <B> Object defaultValue(Class<B> clazz) { 
    return Array.get(Array.newInstance(clazz, 1),0); 
} 
  • Array.newInstance(clazz, 1)將創建一個默認的元素類型clazz的陣列,
  • Array.get(<someArray>, 0)將返回它的第一個元素。
  • 也因爲您的方法defaultValue返回對象它將被自動裝箱到對應的類型int - >Integer

System.out.println(defaultValue(int.class)); 
System.out.println(defaultValue(int.class).getClass()); 

打印

0 
class java.lang.Integer 
+0

真的很整潔的解決方案! – phoenix7360 2013-04-29 16:42:45

+0

@ phoenix7360謝謝:) – Pshemo 2013-04-29 16:43:37

0

爲什麼你需要這個?默認是由編譯器完成的,而不是通過調用現有的方法。

這裏是原語的默認值,你當然可以寫打開此表爲值的函數...

Data Type Default Value (for fields) 
byte  0 
short  0 
int   0 
long  0L 
float  0.0f 
double  0.0d 
char  '\u0000' 
Object  null 
boolean  false 

Read this tutorial link

1

一個實現它的方法是使用地圖存儲值:

private static Map<Class, Object> defaultValues = new HashMap<Class, Object>(); 

static { 
    defaultValues.put(byte.class, 0); 
    defaultValues.put(short.class, 0); 
    defaultValues.put(int.class, 0); 
    defaultValues.put(long.class, 0L); 
    defaultValues.put(float.class, 0.0f); 
    defaultValues.put(double.class, 0.0d); 
    defaultValues.put(char.class, '\u0000'); 
    defaultValues.put(boolean.class, false); 
} 

public <B> Object defaultValue(Class<B> clazz) { 
    return defaultValues.containsKey(clazz) ? defaultValues.get(clazz) : null; 
} 
1

您可以使用ClassUtilsApache lang3 library的:

import org.apache.commons.lang3.ClassUtils; 

public Object defaultValue(Class<?> clazz) throws InstantiationException, IllegalAccessException, 
     IllegalArgumentException, InvocationTargetException { 
    final Class<?> c = ClassUtils.primitiveToWrapper(clazz); 
    if (c != null && !c.equals(clazz)) { 
     final Constructor[] ctors = c.getConstructors(); 
     Constructor ctor = null; 
     for (int i = 0; i < ctors.length; i++) { 
      ctor = ctors[i]; 
      if (ctor.getGenericParameterTypes().length == 0) 
      break; 
     } 
     return ctor.newInstance(0); 
    } else { 
     return null; 
    } 
} 

如果給定的類不是原語,則返回null。您可能想要以更好的方式處理異常。

+0

它也吐NPE。 – milan 2013-04-29 16:15:14

+0

@米蘭是的。我編輯了代碼 – phoenix7360 2013-04-29 16:18:45