2

如何编写一个返回给定类的默认值的函数?如果一个类是原语之一,它应该返回一个具有默认值的包装类,否则返回 null。

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

所以int.class它应该返回Integer(0)

4

4 回答 4

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返回 Object ,它将被自动装箱为相应的类型int-> Integer

例子

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

印刷

0
class java.lang.Integer
于 2013-04-29T16:11:59.187 回答
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;
}
于 2013-04-29T16:07:15.730 回答
1

您可以使用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。您可能希望以更好的方式处理异常。

于 2013-04-29T16:07:50.153 回答
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

阅读本教程链接

于 2013-04-29T16:00:26.593 回答