我在工作中遇到了一些编码挑战,我们被要求执行相当多的业务逻辑,这些业务逻辑会产生一个整数列表。我在Integers的ArrayList的ArrayList中具有所需的信息,但始终无法弄清楚如何将其转换为正确的返回类型。
在键入T或Object时也有许多变化。我已经搜索了堆栈溢出,并且有很多类似的问题,但是没有一个给我直接的答案。他们更具概念性。
问题回答: 输出必须是
List<List<Integer>> (not negotiable).
给出一个现有的:
ArrayList<ArrayList<Integer>> **currentArrayList** HOW do you convert that to a List<List<Integer>>.
我不再需要代码,但是它将使我发疯,能够执行所有逻辑,但不能执行简单的类型转换。
List<List<Integer>> returnList(){
ArrayList<ArrayList<Integer>> currentArrayList = new ArrayList<ArrayList<Integer>>();
ArrayList<Integer> innerList = new ArrayList<Integer>();
innerList.add(new Integer(123));
currentArrayList.add(innerList);
List<List<Integer>> newList = ????
// ??Logic to copy over currentArrayList into newList???
return newList;
}
答案 0 :(得分:1)
答案 1 :(得分:1)
您应针对接口进行操作并删除详细的实现细节。在您的示例中,请改用对class cv2_list(list):
def __getitem__(self, item):
return cv2.imread(super().__getitem__(item))
的引用,因为您可以向其中添加任何List<List<Integer>
实现,包括您的List
。
ArrayList
如果您需要返回新的public List<List<Integer>> returnList(){
List<List<Integer>> currentList = new ArrayList<>();
List<Integer> innerList = new ArrayList<>();
innerList.add(123);
currentList.add(innerList);
return currentList;
}
,只需将其包装到另一个:
List
或者,使返回的return new ArrayList<>(currentList);
不可修改:
List
修改
如果您确实无法使用return Collections.unmodifiableList(currentList);
,可以使用
ArrayList
List
此强制类型转换会引发编译器警告,但是您可以使用return (List) currentArrayList;
忽略它,因为您知道返回了正确的类型。
答案 2 :(得分:0)
如果您可以抑制未选中的强制转换警告,则操作非常简单:
@SuppressWarnings("unchecked")
private static List<List<Integer>> convertToInterfaceVersion(ArrayList<ArrayList<Integer>> original) {
return (List) original;
}
之所以可行是因为List
只是ArrayList
最终实现的接口。但这也是一个为什么人们通常不将其ArrayLists
显式声明为ArrayLists
而是声明为Lists
的典型例子-首先完全避免了这种情况。 / p>
答案 3 :(得分:0)
经验法则:始终尝试对接口进行编码。
如果您不是代码的开头,即没有机会更改返回类型,则可以使用以下代码,它使用ArrayList
的ctor复制通过的List
< / p>
List<List<Integer>> returnList() {
ArrayList<ArrayList<Integer>> currentArrayList = new ArrayList<>();
ArrayList<Integer> innerList = new ArrayList<>();
innerList.add(123);
currentArrayList.add(innerList);
List<List<Integer>> newList = new ArrayList<>(currentArrayList);
return newList;
}
否则,如果有机会更改其返回类型,只需将声明类型更改为List<List<Integer>>
,它将应用经验法则。
List<List<Integer>> returnList() {
List<List<Integer>> currentArrayList = new ArrayList<>();
List<Integer> innerList = new ArrayList<>();
innerList.add(123);
currentArrayList.add(innerList);
return currentArrayList;
}
答案 4 :(得分:0)
就像其他人提到的那样,对接口进行编程。
您的单行解决方案是:
List<List<Integer>> newList = Collections.unmodifiableList(currentArrayList);
但这有明显的缺点:
您不能向其中添加新元素。
考虑一下就很有意义。
您可以将LinkedList<Integer>
添加到List<List<Integer>>
,
您不能将LinkedList<Integer>
添加到List<ArrayList<Integer>>
。
如果需要修改列表的功能,则可以创建一个新列表:
List<List<Integer>> newList = new ArrayList<>(currentArrayList);
这意味着外部列表已复制。
有最后一个您不应该采用的解决方案,并且使用的是原始类型:
List<List<Integer>> newList = (List) currentArrayList;
虽然可以编译,但是如果有人添加例如LinkedList<Integer>
进入该列表,而您仍然希望该列表中的每个元素都是一个ArrayList<Integer>