我有以下方法
static <T> List<T> foo(List<T> arg) {
我想创建一个相同类型的List,称之为outcome
,作为我最终会返回的arg。例如,如果
ArrayList<Integer> arg = new ArrayList<Integer>();
我希望foo也返回ArrayList<Integer>
。
如果
LinkedList<Integer> arg = new LinkedList<Integer>();
然后我希望foo返回LinkedList<Integer>
我知道List<T> outcome = new List<T>();
不会起作用,因为List是抽象的,所以我想写什么来做我想做的事?
答案 0 :(得分:4)
您可以使用反射
List<T> list = (List<T>)arg.getClass().newInstance(); // throws
您可以进一步约束您的方法签名
static<L extends List<?>> L foo(L arg) { ... }
LinkedList<Integer> x = foo( new ArrayList<Integer>() ); // doesn't compile
答案 1 :(得分:3)
如果您有某种返回类型,可以返回该返回类型的任何子类,因此您可以返回ArrayList<T>
。
编辑(1) :如果您想返回与参数类型相同的List
,可以使用instanceof
:
static <T> List<T> foo(List<T> arg) {
List<T> outcome = null;
if (arg instanceof ArrayList)
outcome = new ArrayList<T>();
if (arg instanceof LinkedList)
outcome = new LinkedList<T>();
...
return outcome;
}
您可以找到实施List
here的完整列表。
编辑(2) :这是另一个想法:
static <T, U extends List<T>> U foo(U arg) {
U outcome = arg;
...
return outcome;
}
但是,您可能会将您传递的列表销毁为arg
,但您应该可以传递副本。
答案 2 :(得分:-1)
您可以尝试优秀的Google番石榴图书馆。我认为Lists类有你需要的东西: http://docs.guava-libraries.googlecode.com/git-history/v13.0.1/javadoc/index.html