Java 如何查找对象数组的类型

Java 如何查找对象数组的类型,java,arrays,Java,Arrays,我有一个将数组作为对象传递的用例。我必须在运行时找出数组的类型,并生成相同类型的列表 public class Test { public static Object getArray(Object value) { Object returnVal = value; if(value!=null && value.getClass().isArray()){ returnVal = Arrays.asList(v

我有一个将数组作为对象传递的用例。我必须在运行时找出数组的类型,并生成相同类型的列表

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.
    }
}
如果我运行下面的代码,我将得到一个结果作为列表,完整的数组作为第一个元素

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


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

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

您可以使用以下命令查找阵列的类型:

value.getClass().getComponentType()

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

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

public static Object[] getArray(Object value) {
    return value != null && !value.getClass().isArray()
        ? new Object[] { value }
        : (Object[]) value;
}
您可以使用以下命令查找阵列的类型:

value.getClass().getComponentType()
但由于运行时类型擦除,列表在运行时没有类型,因此您是否知道数组的类型无关紧要

public static Object[] getArray(Object value) {
    return value != null && !value.getClass().isArray()
        ? new Object[] { value }
        : (Object[]) value;
}
如果对象不是数组,则将其包装在数组中,否则将其强制转换为数组

您可以创建一个类型检查列表,但不幸的是,您需要一个
Class
参数来在编译时进行类型安全性检查

Object[] array = (Object[]) value;
List<?> list = Collections.checkedList(Arrays.asList(array), value.getComponentType());
Object[]数组=(Object[])值;
List List=Collections.checkedList(Arrays.asList(array),value.getComponentType());
如果对象不是数组,则将其包装在数组中,否则将其强制转换为数组

您可以创建一个类型检查列表,但不幸的是,您需要一个
Class
参数来在编译时进行类型安全性检查

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

除非将
强制转换为
对象[]
数组,
数组。asList(…)
将使用单个元素调用,即值本身

但是,您的代码并没有显示与您的问题相同的意图:它看起来像是试图返回对象本身(如果它不是数组)数组的第一个元素(如果
是数组)。如果是这样,您根本不需要列表。您还可以使用
可选的
给它一个流畅的新外观(当然,您可以在不使用
可选的
的情况下实现同样的效果):


唯一令人尴尬的边缘大小写是一个空数组,它将作为一个空数组返回。

除非将
强制转换为
对象[]
数组,
数组。asList(…)
将使用单个元素调用,即值本身

但是,您的代码并没有显示与您的问题相同的意图:它看起来像是试图返回对象本身(如果它不是数组)数组的第一个元素(如果
是数组)。如果是这样,您根本不需要列表。您还可以使用
可选的
给它一个流畅的新外观(当然,您可以在不使用
可选的
的情况下实现同样的效果):

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

我解决了您的问题:

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 Array.get(value, 0);
我解决了你的问题:

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 Array.get(value, 0);

为什么参数的类型必须是
Object
?正如我提到的,传递的值可以是任何类型。我需要忽略它们,只有当它是一个数组时才处理为什么你会创建一个可以接受任何东西的静态方法,但是只有当参数是一个特定的给定类型时才会执行某些操作?对我来说,这听起来像是一个设计缺陷。@Synch这是我为了这个问题而做的一个小的可运行的片段。最初的方法是不同的,不是静态的。我只是把它缩短到point@Pardha.Saradhi我解决了你的问题,看看我的答案。基元数组不是对象数组。因此,
(Object[])值
代码不起作用。Java提供了
Array
类来解决从所有数组类型中获取第一个元素的问题。希望能提供帮助。为什么参数的类型必须是
Object
?正如我提到的,传递的值可以是任何类型。我需要忽略它们,只有当它是一个数组时才处理为什么你会创建一个可以接受任何东西的静态方法,但是只有当参数是一个特定的给定类型时才会执行某些操作?对我来说,这听起来像是一个设计缺陷。@Synch这是我为了这个问题而做的一个小的可运行的片段。最初的方法是不同的,不是静态的。我只是把它缩短到point@Pardha.Saradhi我解决了你的问题,看看我的答案。基元数组不是对象数组。因此,
(Object[])值
代码不起作用。Java提供了
Array
类来解决从所有数组类型中获取第一个元素的问题。希望有帮助。无法将整数数组强制转换为ObjectArray。得到这个。java.lang.ClassCastException:[我无法转换为[Ljava.lang.Object;无法将整数数组转换为ObjectArray。获取此.java.lang.ClassCastException:[我无法转换为[Ljava.lang.Object;