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