如何編寫一個函數,該函數返回給定類的默認值?如果一個類是其中一個原語,它應該返回一個包含默認值的包裝類,否則返回null。某個類的默認值
public <B> Object defaultValue(Class<B> clazz) {
return clazz.isPrimitive() ? ... : null;
}
所以對於int.class
它應該返回Integer(0)
。
如何編寫一個函數,該函數返回給定類的默認值?如果一個類是其中一個原語,它應該返回一個包含默認值的包裝類,否則返回null。某個類的默認值
public <B> Object defaultValue(Class<B> clazz) {
return clazz.isPrimitive() ? ... : null;
}
所以對於int.class
它應該返回Integer(0)
。
如何編寫一個返回給定類的默認值的函數?如果一個類是其中一個原語,它應該返回一個包含默認值的包裝類,否則返回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
真的很整潔的解決方案! – phoenix7360 2013-04-29 16:42:45
@ phoenix7360謝謝:) – Pshemo 2013-04-29 16:43:37
爲什麼你需要這個?默認是由編譯器完成的,而不是通過調用現有的方法。
這裏是原語的默認值,你當然可以寫打開此表爲值的函數...
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
一個實現它的方法是使用地圖存儲值:
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;
}
您可以使用ClassUtils
類Apache 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。您可能想要以更好的方式處理異常。
它也吐NPE。 – milan 2013-04-29 16:15:14
@米蘭是的。我編輯了代碼 – phoenix7360 2013-04-29 16:18:45
你不能做一個單行(如果這是你想做的事)。 – 2013-04-29 15:55:07
不一定是一條線。 – milan 2013-04-29 15:56:12
爲每個可能的類別做出單獨的'if'情況。 – 2013-04-29 15:56:20