如何查找对象数组的类型

时间:2017-11-30 12:21:16

标签: java arrays

我有一个用例,其中一个数组作为Object传递。我必须在运行时弄清楚数组的类型并生成相同类型的列表。

public class Test {

    public static Object getArray(Object value) {
        Object returnVal = value;
        if(value!=null && value.getClass().isArray()){
            returnVal = Arrays.asList(value).get(0);
        }
        return returnVal;
    }

    public static void main(String[] args) {
        int[] k = new int[]{1,2,3,4,43,4};
        Object val = getArray(k);
        // val should be 1st element of the array. So, val should be equal to 1.
    }
}

如果我运行以下代码,我将得到一个结果作为List,并将完整数组作为第一个元素。

我只需要返回数组的第一个元素。

传递的值可以是任何值,因此我无法更改返回类型。

4 个答案:

答案 0 :(得分:1)

除非您将value强制转换为Object[]数组,否则将使用单个元素(值本身)调用Arrays.asList(...)

但是,您的代码没有显示与您的问题相同的意图:看起来您正在尝试返回该对象(如果它不是数组) 数组的第一个元素(如果value 数组)。如果是这样,您根本不需要列表。并且您可以使用Optional为其提供流畅的新外观(当然,如果没有Optional,您可以实现相同的目标):

return Optional.ofNullable(value)
        .filter(Object[]::isInstance)  // if value is an array
        .map(Object[].class::cast)     // cast to an Object[] array
        .filter(arr -> arr.length > 0) // ensure non-empty
        .map(arr -> arr[0])            // grab the first element
        .orElse(value);                // fallback to returning the raw value

唯一尴尬的边缘情况是一个空数组,它将被返回。

答案 1 :(得分:1)

我解决了你的问题:

import java.lang.reflect;

public static Object getArray(Object value){

    if (value != null && value.getClass().isArray()){
       return Array.getLength(value) == 0 ? null : Array.get(value, 0);
    }
    return value;
}

如果您确定数组的长度不能为零,您可以像这样编写return语句:

return Array.get(value, 0);

答案 2 :(得分:0)

您无法创建仅在运行时已知的类型的列表。

您可以使用以下方法找到阵列的类型:

value.getClass().getComponentType()

但由于运行时类型擦除,列表在运行时没有类型,因此无论您是否知道数组的类型都无关紧要。

答案 3 :(得分:0)

public static Object[] getArray(Object value) {
    return value != null && !value.getClass().isArray()
        ? new Object[] { value }
        : (Object[]) value;
}

如果对象不是数组,则将其包装在数组中,否则将其强制转换为数组。

你可以创建一个 checked 类型的列表,但遗憾的是你在编译时需要一个Class<T>参数来进行类型安全性检查。

Object[] array = (Object[]) value;
List<?> list = Collections.checkedList(Arrays.asList(array), value.getComponentType());