将未知类型通用列表转换为数组

时间:2015-07-06 12:42:21

标签: java arrays generics reflection

我正在使用反射进行映射。

通过反射,我可以知道类的每个Field是否引用了“array”类型的属性,而且我也可以获得具有数组类型的Class。

现在,我想设置对象字段的值。现在,出于某种原因,我可以获取数据来填充对象字段,但它不是数组的形式。相反,是Collection<?>

为了便于可视化,我有一些类似的代码:

/** create a new T instance, with the data taken from something*/
<T> T convert(Class<T> cls, Object something) {
    T obj = cls.newInstance();
    for (Field field : cls.getFields()) {
        if (field.getType().isArray()) {
            Class<?> arrayType = field.getType().getComponentType();
            Collection<?> collection = this.getData(arrayType, something);

            Object array = CONVERT(collection);

            field.set(obj, arrayData);
        }
    }
}

在一天结束时,我需要将Collection<?>对象转换为(hypotetically)一个?[]对象,其中“?”是非常正确的。

我知道有collData.toArray(),但它构建了一个Object[],这是不相容的;我知道有collData.toArray(T[]),但我不知道如何在这种情况下使用它。

3 个答案:

答案 0 :(得分:2)

由于您已有组件类型,请使用Array.newInstance

Object[] array = collection.toArray(
                    (Object[])Array.newInstance(arrayType, collection.size()));
field.set(obj, array);

答案 1 :(得分:1)

或者按照以下方式进行,这更容易理解。创建一个数组并将其作为参数提供给colleation.toArray

Object[] array = collection.toArray(new Object[collection.size()] );
field.set(obj, array);

答案 2 :(得分:0)

作为toArray()函数的集合,返回Collection填充的数组。 来自java doc:

String[] y = x.toArray(new String[0]);