如何编写java函数来返回动态类型的数组?

如何编写java函数来返回动态类型的数组?,java,arrays,generics,Java,Arrays,Generics,我有一种情况,我想得到一个对象的数组,不管该对象是什么类型的 以下是我尝试过的: 调用函数的代码: wsDeployedExaminersResponseVO.setDeployedExaminers((DeployedExaminersVO[]) returnArrayForType(wsDeployedExaminersVO)); public static Object[] returnArrayForType(Object type) throws Exception { Ob

我有一种情况,我想得到一个对象的数组,不管该对象是什么类型的

以下是我尝试过的:

调用函数的代码:

wsDeployedExaminersResponseVO.setDeployedExaminers((DeployedExaminersVO[]) returnArrayForType(wsDeployedExaminersVO));
 public static Object[] returnArrayForType(Object type) throws Exception {
   Object[] objects={type};
   return objects;
 }
功能代码:

wsDeployedExaminersResponseVO.setDeployedExaminers((DeployedExaminersVO[]) returnArrayForType(wsDeployedExaminersVO));
 public static Object[] returnArrayForType(Object type) throws Exception {
   Object[] objects={type};
   return objects;
 }
但是当我运行代码时,我在调用代码的地方得到了casting异常。我这样做的原因是因为我正在尝试自动生成java代码,并且我需要一个函数,该函数将返回参数类型的数组,或者一个一行代码,该代码可以在运行时根据类型动态地适应set函数

根据,您可以使用泛型来解决它。我希望下面的代码有帮助

public static void main(String[] args) throws Exception {
    Integer[] a = genericMethod(Integer.class, 5);
    String[] b = genericMethod(String.class, "dddddddddddd");
}

public static <T> T[] genericMethod(Class<T> clazz, T input) {
    @SuppressWarnings("unchecked")
    T[] res = (T[]) Array.newInstance(clazz, 1);
    res[0] = input;
    return res;
}
publicstaticvoidmain(字符串[]args)引发异常{
整数[]a=genericMethod(Integer.class,5);
String[]b=genericMethod(String.class,“dddddddd”);
}
公共静态T[]genericMethod(类clazz,T输入){
@抑制警告(“未选中”)
T[]res=(T[])Array.newInstance(clazz,1);
res[0]=输入;
返回res;
}
两个问题:

  • 你们有多少件
  • 您需要对象的实际类型还是超级类型
  • 解决方案

    1,仅适用于1个实例

      @SuppressWarnings("unchecked")
      public static <T> T[] getArray(T value) {
        Object array = Array.newInstance(value.getClass(), 1);
        Array.set(array, 0, value);
        return (T[]) array;
      }
    
      @SuppressWarnings("unchecked")
      public static <T> T[] getArray(Class<T> clz, Object value) {
        Object array = Array.newInstance(clz, 1);
        Array.set(array, 0, value);
        return (T[]) array;
      }
    
    @SuppressWarnings(“未选中”)
    公共静态T[]getArray(T值){
    对象数组=array.newInstance(value.getClass(),1);
    数组.set(数组,0,值);
    返回(T[])数组;
    }
    
    2、对于多个对象

      @SuppressWarnings("unchecked")
      public static <T> T[] getArray(T... value) {
        return value;
      }
    
    @SuppressWarnings(“未选中”)
    公共静态T[]getArray(T…值){
    返回值;
    }
    
    3、对于显式类型

    3.1例如

      @SuppressWarnings("unchecked")
      public static <T> T[] getArray(T value) {
        Object array = Array.newInstance(value.getClass(), 1);
        Array.set(array, 0, value);
        return (T[]) array;
      }
    
      @SuppressWarnings("unchecked")
      public static <T> T[] getArray(Class<T> clz, Object value) {
        Object array = Array.newInstance(clz, 1);
        Array.set(array, 0, value);
        return (T[]) array;
      }
    
    @SuppressWarnings(“未选中”)
    公共静态T[]getArray(类clz,对象值){
    objectarray=array.newInstance(clz,1);
    数组.set(数组,0,值);
    返回(T[])数组;
    }
    
    3.2对于多个实例

      @SuppressWarnings("unchecked")
      public static <T> T[] getArray(Class<T> clz, Object... values) {
        Object array = Array.newInstance(clz, values.length);
        System.arraycopy(values, 0, clz, 0, values.length);
        return (T[]) array;
      }
    
    @SuppressWarnings(“未选中”)
    公共静态T[]getArray(类clz,对象…值){
    objectarray=array.newInstance(clz,values.length);
    数组复制(值,0,clz,0,值,长度);
    返回(T[])数组;
    }
    
    但请注意,第二种方式的类型由编译器推断。例如:
    getArray(“1”,1)
    将返回
    Serializable[]
    。您可以添加异常吗?