如何编写一个返回给定类的默认值的函数?如果一个类是原语之一,它应该返回一个具有默认值的包装类,否则返回 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
返回 Object ,它将被自动装箱为相应的类型int
-> Integer
。例子
System.out.println(defaultValue(int.class));
System.out.println(defaultValue(int.class).getClass());
印刷
0
class java.lang.Integer
实现它的一种方法是使用地图来存储值:
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;
}
您可以使用Apache lang3 库ClassUtils
的类:
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。您可能希望以更好的方式处理异常。
你为什么需要这个?默认值由编译器完成,而不是通过调用现有方法。
这是原语的默认值,您当然可以编写一个将这个表转换为值的函数......
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