【问题标题】:How to write a java function to return array of dynamic type?如何编写一个java函数来返回动态类型的数组?
【发布时间】:2018-04-24 17:03:48
【问题描述】:

我有一种情况,我想获取一个对象的数组,无论对象是什么类型。

以下是我尝试过的:

调用函数的代码:

wsDeployedExaminersResponseVO.setDeployedExaminers((DeployedExaminersVO[]) returnArrayForType(wsDeployedExaminersVO));

函数代码:

 public static Object[] returnArrayForType(Object type) throws Exception {
   Object[] objects={type};
   return objects;
 }

但是当我运行代码时,我会在调用代码的地方抛出异常。我这样做的原因是因为我正在尝试自动生成 java 代码,并且我需要一个函数,它将返回参数类型的数组或一个可以根据 set 函数动态适应的单行代码运行时的类型。

【问题讨论】:

  • 可以添加例外吗?

标签: java arrays generics


【解决方案1】:

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

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;
}

【讨论】:

    【解决方案2】:

    两个问题:

    1. 你有多少物品?
    2. 你需要对象的实际类型还是超类型?

    解决方案

    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;
      }
    

    2、对于多个对象

      @SuppressWarnings("unchecked")
      public static <T> T[] getArray(T... value) {
        return value;
      }
    

    3、对于显式类型

    3.1 对于 1 个实例

      @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;
      }
    

    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;
      }
    

    【讨论】:

    • 但是请注意,第二种方式的类型是由编译器推断出来的。例如:getArray("1", 1) 将返回 Serializable[]
    猜你喜欢
    • 1970-01-01
    • 2011-06-24
    • 2022-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-27
    • 1970-01-01
    • 2020-04-02
    相关资源
    最近更新 更多