如何编写一个返回给定类默认值的函数?如果一个类是其中一个原语,它应该返回一个带默认值的包装类,否则返回null。
public <B> Object defaultValue(Class<B> clazz) {
return clazz.isPrimitive() ? ... : null;
}
因此对于int.class
,它应该返回Integer(0)
。
答案 0 :(得分: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
- &gt; Integer
。实施例
System.out.println(defaultValue(int.class));
System.out.println(defaultValue(int.class).getClass());
打印
0
class java.lang.Integer
答案 1 :(得分: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;
}
答案 2 :(得分:1)
您可以使用Apache lang3 library的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。您可能希望以更好的方式处理异常。
答案 3 :(得分: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