编程语言
首页 > 编程语言> > Java中的泛型方法应该具有什么签名,以便它可以接受任何>和……?

Java中的泛型方法应该具有什么签名,以便它可以接受任何>和……?

作者:互联网

我想创建一个遍历任何存储ArrayList< U>的集合的方法. – 让我们称之为收集T;例如,它可以是LinkedList,ArrayList或任何其他Collection; U – 是另一种需要记忆的类型;我想要创建的方法应该返回相同的集合T但它应该存储LinkedList< U>代替.

“错误的”希望声明:

public <T extends Collection, U> T<LinkedList<U>> rewrap (T<ArrayList<U>> arrayList) {
    T<LinkedList<U>> linkedList = new T<LinkedList<U>>();
    // do some stuff here
    return linkedList;
}

我仔细阅读了documentation,但我找不到如何实现目标的方法.

解决方法:

我的建议:

public static <T, C extends Collection<LinkedList<T>>> C rewrap (Collection<ArrayList<T>> in, Supplier<C> collectionFactory) {

    C out = collectionFactory.get ();

    for (ArrayList<T> list : in) {
      out.add (new LinkedList<T> (list));
    }

    return out;
}

请注意,您必须传递供应商才能使该方法能够创建所需类型的Collection实例.

用法:

ArrayList<ArrayList<String>> in = new ArrayList<> ();
in.add (new ArrayList<String> ());
in.get (0).add ("abc");
ArrayList<LinkedList<String>> out = rewrap (in, ArrayList::new);

编辑:您应该注意,此方法不要求输出外部Collection的类型与输入外部Collection的类型相同.

例如,您可以传递ArrayList< ArrayList< String>>输入并获取HashSet< LinkedList< String>>如果在上面的示例中传递HashSet :: new供应商而不是ArrayList :: new,则输出.

标签:generic-programming,generic-collections,java,generics
来源: https://codeday.me/bug/20190828/1748719.html