我有三个不同类型的Arraylist如何在一个列表中添加这些列表

时间:2017-04-10 12:34:08

标签: java android

firstlist secondlist thirdlist newlist.add(firstlist) newlist.add(secondlist) newlist.add(thirdlist)enter code here 如何将这些aray列表添加到单个arralist中,这些列表是不同的类型

2 个答案:

答案 0 :(得分:1)

我不知道你为什么要在另一个列表中将三个不同类型的列表组合在一起,但这里有一个可以帮助你的例子:

    public class stackoverflow {

    public static void main(String[] args) {
        // TODO code application logic here

        List<String> stringList = new ArrayList<>();
        stringList.add("hello");
        stringList.add("world");

        List<Integer> integerList = new ArrayList<>();
        integerList.add(2);
        integerList.add(3);

        List<Double> doubleList = new ArrayList<>();
        doubleList.add(3.5);
        doubleList.add(5.6);

        List<List<?>> finalList = new ArrayList<>();

        finalList.add(stringList);
        finalList.add(integerList);
        finalList.add(doubleList);

        System.out.println(finalList.get(0).get(0));
        System.out.println(finalList.get(0).get(1));
        System.out.println(finalList.get(1).get(0));
        System.out.println(finalList.get(1).get(1));
        System.out.println(finalList.get(2).get(0));
        System.out.println(finalList.get(2).get(1));
    }

}

这是输出:

  

您好

     

世界

     

2

     

3

     

3.5

     

5.6

答案 1 :(得分:1)

正如其他人之前提到的,在一个列表中包含这三个不同类型的列表可能不是一个好主意。原因是您以后无法避免向下投射,这可能会导致不合需要的运行时错误。

然而,解决方案非常简单。我将假设您有三个不同类型的列表,并且您希望所有值都包含在一个列表中。在这种情况下,您只需要一个带有类型签名的列表:

List<Object> containsAnything = new ArrayList<>();
containsAnything.addAll(someListOfIntegers);
containsAnything.addAll(someListOfStrings);

如果您的意思是创建一个包含不同类型列表的列表,则适用相同的概念。

要了解其工作原理,请在声明具有泛型类型的列表时考虑您在做什么。当我们说我们想要一个

List<Integer> 

我们说我们想要一个只包含整数类型元素的列表。但是在java中,通过它的父类型来调用对象的子类是完全有效的。例如,我们可以将某些内容声明为

List<Integer> example = new ArrayList<Integer>();

我们可以看到这实际上是一个ArrayList(包含整数)但我们告诉编译器它是一个List。这很好,因为ArrayList扩展了List,我们知道ArrayList保证至少支持list支持的所有操作,所以在这里使用List是安全的。

现在java中的所有类都扩展了对象类,因此每个类都是Object类型。因此,当我们创建一个

List<Object> 

我们正在创建一个可以容纳任何内容的列表。现在我们可以将整数和字符串以及(无论你想要的话)添加到列表中,编译器不会抱怨。作为一种快捷方式,您只需使用实际代表

的List
List<Object>. 

现在为什么这么糟糕?好吧,因为大概在某些时候你想从列表中取出一些东西。但它只是一个对象列表,所以当我们拿出它时,我们怎么知道它是什么类型?那么你必须做出一个有根据的猜测并向下转换它的类型,但这暴露了可能在编译时捕获的运行时错误的可能性。

List conatainsAnything = new ArrayList<>();
containsAnything.add("something");
containsAnything.add(1);
Integer notAnInteger = (Integer) myList.get(0);
COMPILER DOESN'T COMPLAIN...

如果你想避免令人讨厌的应用程序破坏运行时错误,你需要在任何地方使用try-catch块,或者你必须非常仔细地跟踪列表中的内容。无论哪种方式都容易出错并且要求麻烦。 总的来说,也许最好找到另一种解决方案来支持你想到的任何功能。

相关问题