繁体   English   中英

如何根据Java中输入变量的未知List类型声明变量?

[英]How to declare a variable according to an unknown List type of the input variable in Java?

如何根据Java中输入变量的未知List类型声明变量?

例如::

给你 arr1,你需要(浅)从 arr1 复制到 arr2。 但是你不知道列表 arr1 是什么类型的。

这是我使用的代码,如果我想声明 arr2,我必须通过所有可能的 List 类型的情况来 go。

  static List<Object> funcOri(List<Object> arr1, List<Object> arr2) {
    if (arr1 instanceof ArrayList<?>) {
      arr2 = new ArrayList<Object>(arr1);
    } else if (arr1 instanceof LinkedList<?>) {
      arr2 = new LinkedList<Object>(arr1);
    } else if (...) {
      ;
    }
    return arr2;
  }

根据 arr1 的类型声明 arr2 有没有更简单的方法?

也许只是看起来像::

  static List<Object> funcWanted(List<Object> arr1, List<Object> arr2) {
    arr2 = new XXXList<Object>(arr1); // where XXXList is base on the type of list the arr1 is
    return arr2;
  }

您始终可以尝试使用反射创建 arr1 的 class 的新实例。

public class ListClone {

    public static void main(String[] args) throws InvocationTargetException, NoSuchMethodException, InstantiationException, IllegalAccessException {
        List<String> al = new ArrayList<>();
        al.add("abc");

        List<String> ll = new LinkedList<>();
        ll.add("123");

        List<String> alc = funcOri(al);
        List<String> llc = funcOri(ll);

        System.out.println(alc.getClass().getSimpleName());
        System.out.println(llc.getClass().getSimpleName());

        alc.add("def");
        llc.add("456");

        System.out.println(al);
        System.out.println(alc);

        System.out.println(ll);
        System.out.println(llc);
    }

    static <T> List<T> funcOri(List<T> arr1) throws NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {
        Constructor<? extends List> constructor = arr1.getClass().getConstructor(Collection.class);
        constructor.setAccessible(true);
        return constructor.newInstance(arr1);
    }
}

Output:

ArrayList
LinkedList
[abc]
[abc, def]
[123]
[123, 456]

编辑

这假设 arr1 的列表类型有一个构造函数来获取一个 Collection。 当然,完全有可能存在没有的 List 实现。 一个更安全的解决方案可能是将 go 作为默认构造函数并使用 List.addAll() 复制内容,但我们仍然不能确定所有 List 实现都有默认构造函数。 然后它将抛出 NoSuchMethodException。

除非我完全误解了您的问题,否则这就是您所需要的(Java 8)

public class ListCopyDemo {
    
    public static void main (String[] args) {
        List<String> original = new ArrayList<>();
        original.add("Hello World!");
        original.add("Welcome to Java");
        
        List<?> copy = ListCopyDemo.funcOri(original); // should return a copy of the original
    }
    
    public static List<Object> funcOri(List<?> arr1) {
        return arr1.stream().collect(Collectors.toList());
    }
}

如果要将original List 类型更改为List<Integer>LinkedList<String> ,则funcOri的工作方式相同。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM