Java ArrayList的转换<;ArrayList<;整数>&燃气轮机;列出<;列表<;整数>&燃气轮机;

Java ArrayList的转换<;ArrayList<;整数>&燃气轮机;列出<;列表<;整数>&燃气轮机;,java,list,arraylist,Java,List,Arraylist,我在工作中做了一个小的编码挑战,我们需要执行相当多的业务逻辑,从而生成一个整数列表。我在ArrayList of ArrayList of Integers中包含了所需的信息,但我始终不知道如何将其转换为正确的返回类型 在键入时使用T或Object也有很多变化。我搜索过堆栈溢出,有许多类似的问题,但没有一个能给我一个直接的答案;它们更具概念性 要回答的问题: 输出必须是一个 List<List<Integer>> (not negotiable). 列表(不可

我在工作中做了一个小的编码挑战,我们需要执行相当多的业务逻辑,从而生成一个整数列表。我在ArrayList of ArrayList of Integers中包含了所需的信息,但我始终不知道如何将其转换为正确的返回类型

在键入时使用T或Object也有很多变化。我搜索过堆栈溢出,有许多类似的问题,但没有一个能给我一个直接的答案;它们更具概念性

要回答的问题: 输出必须是一个

    List<List<Integer>> (not negotiable). 
列表(不可协商)。
鉴于现有的:

    ArrayList<ArrayList<Integer>> **currentArrayList** HOW do you convert that to a List<List<Integer>>. 
ArrayList**currentArrayList**如何将其转换为列表。
我不再需要代码了,但它会让我发疯,因为我能够完成所有的逻辑,而不是简单的类型转换

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;
} 
List returnList(){
ArrayList currentArrayList=新建ArrayList();
ArrayList innerList=新的ArrayList();
add(新的整数(123));
currentArrayList.add(内部列表);
列表新建列表=????
//?通过currentArrayList复制到newList的逻辑???
返回newList;
} 

只需像这样更改声明类型,因为
ArrayList
扩展自实现
List
AbstractList

List<List<Integer>> returnList(){
    List<List<Integer>> currentArrayList = new ArrayList<>();
    List<Integer> innerList = new ArrayList<>();
    innerList.add(new Integer(123));
    currentArrayList.add(innerList);
    return currentArrayList;
}
List returnList(){
List currentArrayList=新建ArrayList();
List innerList=new ArrayList();
add(新的整数(123));
currentArrayList.add(内部列表);
返回当前数组列表;
}


运行

如果您对取消未检查的强制转换警告没有异议,那么它很简单:

@SuppressWarnings("unchecked")
private static List<List<Integer>> convertToInterfaceVersion(ArrayList<ArrayList<Integer>> original) {
  return (List) original;
}
@SuppressWarnings(“未选中”)
私有静态列表转换为接口版本(ArrayList原件){
返回(列表)原件;
}

这是可能的,因为
List
只是
ArrayList
最终实现的一个接口。但这也是一个很好的例子,说明了为什么人们通常不会将他们的
ArrayLists
显式声明为
ArrayLists
,而是像
list
——它从一开始就完全防止了这种情况。

您应该针对接口工作,删除extact实现细节。在您的示例中,请参考
列表经验法则:始终尝试对接口进行编码

如果您不是代码的开头,也就是说,没有机会更改返回类型,您可以使用以下命令,它使用
ArrayList的ctor
复制通过的
列表

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 returnList(){
ArrayList currentArrayList=新建ArrayList();
ArrayList innerList=新的ArrayList();
添加(123);
currentArrayList.add(内部列表);
List newList=new ArrayList(当前ArrayList);
返回newList;
}
否则,如果有机会更改其返回类型,只需将声明类型更改为
List
,它将应用经验法则

List<List<Integer>> returnList() {
   List<List<Integer>> currentArrayList = new ArrayList<>();
   List<Integer> innerList = new ArrayList<>();
   innerList.add(123);
   currentArrayList.add(innerList);
   return currentArrayList;
}
List returnList(){
List currentArrayList=新建ArrayList();
List innerList=new ArrayList();
添加(123);
currentArrayList.add(内部列表);
返回当前数组列表;
}

如其他人所述,编程到接口

您的单线解决方案是:

List<List<Integer>> newList = Collections.unmodifiableList(currentArrayList);
List newList=集合。不可修改列表(currentArrayList);
但这有一个明显的缺点:
不能向其中添加新元素

如果你仔细想想,这是有道理的。
虽然您可以将
链接列表
添加到
列表
, 您不能将
链接列表添加到
列表

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<List<Integer>> newList = new ArrayList<>(currentArrayList);
List newList=newarraylist(当前ArrayList);
这意味着将复制外部列表

您不应采用最后一种解决方案,它使用的是原始类型:

List<List<Integer>> newList = (List) currentArrayList;
List newList=(List)currentArrayList;

虽然这将进行编译,但如果有人在该列表中添加(例如)一个
LinkedList
,而您仍然希望该列表中的每个元素都是
ArrayList

list currentArrayList=new ArrayList(),它可能会在以后中断是什么让您认为您应该能够进行此转换?
列表
不是
列表
@VeeArr并不意味着它不能被转换。@shmosel当然是这样;我只是想指出,没有一种方法必须是类型安全的,类似于将
对象
强制转换到特定子类的方式(尽管原因不同)。您不必强制转换。您可以将它们复制到新列表中:
list newList=new ArrayList(currentArrayList)从一开始这就是正确的方法,但是如果遗留代码正在处理中,可能很难返回并简单地将其声明为
List
s的
List
。@Treebasher我想一点编码挑战不是遗留代码,并且这里不会修改方法返回类型,只有实现细节。@lealcelderio如我在回答中所述,您可能应该将
ArrayList innerList=new ArrayList()
更改为
List innerList=new ArrayList()也是。@Glains当然!这是我从一开始的意图。我完全错过了这一点:)非常感谢你指出这一点!键入:
currentArray
应为
currentList
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>> newList = new ArrayList<>(currentArrayList);
List<List<Integer>> newList = (List) currentArrayList;