创建通用列表时出现问题

时间:2012-01-01 15:43:23

标签: java list generics

List<Integer> ints = Arrays.asList(1,2,3,4,5);
List<Double> doubles = Arrays.asList(226.6131 , 7789879.3  );
List<Long>  longs  = Arrays.asList( 687643643687L , 743926945627L );
List<List<?>> lists =  Arrays.asList(ints, doubles , longs); // Type mismatch: cannot convert from List<List<? extends Number&Comparable<?>>> to List<List<?>> 
List<List<? extends Number & Comparable<?>>> lists =  Arrays.asList(ints, doubles , longs); // Syntax error on token "&", , expected

我正在尝试创建一个列表列表,如上面的代码所示。首先,我有3个列表,每个列表都存储extends Number implements Comparable的元素。接下来我想把3个列表放到另一个列表中,但我无法做到这一点。

List<List<?>> lists =  Arrays.asList(ints, doubles , longs); 

此行显示编译错误,指出无法从List<List<? extends Number&Comparable<?>>>转换为List<List<?>>

当我尝试修改下一行中的引用类型时,会出现语法错误。 如何将上面的3个列表(intsdoubleslongs)转换为另一个List<>

编辑:相关问题:  声明扩展ListList的{​​{1}} Number个元素的正确语法是什么?

6 个答案:

答案 0 :(得分:2)

我相信你想要的东西:

List<? extends List<?>> lists =  Arrays.asList(ints, doubles , longs);

您可以使用此表单以获得更多类型的安全性:

List<? extends List<? extends Number>> lists =  Arrays.<List<? extends Number>>asList(ints, doubles , longs);

答案 1 :(得分:2)

你可以试试这个:

List<? extends List<? extends Number>> lists
    =  Arrays.asList(ints, doubles , longs);

这仍然会提供未经检查的转换警告,但与目前为止提供的其他解决方案相比,它提供了更多的类型安全性。

您始终可以通过不使用Arrays.asList

以类型安全的方式执行此操作
List<List<? extends Number>> lists = new ArrayList<List<? extends Number>>();
lists.add(ints);
lists.add(doubles);
lists.add(longs);

答案 2 :(得分:1)

如果您的第二个列表由扩展类号的对象组成,您可以尝试:

List<? extends List<? extends Number>> lists =  Arrays.asList(ints, doubles , longs);

答案 3 :(得分:0)

我不建议在列表中混合使用不同的类型。 如果你想这样做,我想你可以试着去掉内部列表中的泛型类型来保存任何对象。

List<List> lists =  Arrays.asList(ints, doubles , longs); 

答案 4 :(得分:0)

List<List<? extends Comparable<? extends Number>>> list = new ArrayList<List<? extends Comparable<? extends Number>>>();

list.add(整型);

答案 5 :(得分:0)

怎么样:

List<? extends Number> ints = (List<Integer>)Arrays.asList(1,2,3,4,5);
List<? extends Number> doubles = (List<Double>)Arrays.asList(226.6131 , 7789879.3  );
List<? extends Number>  longs  = (List<Long>)Arrays.asList( 687643643687L , 743926945627L );
List<List<? extends Number>> lists = Arrays.asList( ints, doubles, longs ); 

它没有任何气味和所有类型的安全性。

我希望添加Comparable并不困难。