如何根据java中输入变量的未知列表类型声明变量?
例如::
你得到了arr1,你需要从arr1复制到arr2。但你不知道arr1是什么类型的列表。
这是我使用的代码,如果我想声明arr2,我必须遍历列表类型的所有可能情况。
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;
}
2条答案
按热度按时间yqlxgs2m1#
除非我完全误解了你的问题,否则这就是你需要的(Java8)
如果你要改变
original
列表类型到List<Integer>
或者LinkedList<String>
,的funcOri
也一样。nzk0hqpo2#
您可以尝试使用反射创建arr1类的新示例。
输出:
编辑
这假设arr1的列表类型有一个构造函数来获取集合。当然,完全有可能存在不存在的列表实现。一个稍微安全一点的解决方案可能是使用默认构造函数并使用list.addall()复制内容,但我们仍然不能确定所有列表实现都有默认构造函数。然后它将抛出nosuchmethodexception。