是否可以拥有一组通用集合?

时间:2011-06-06 16:13:53

标签: java

我正在编写一些需要处理任意数量的双精度列表的代码。但是,虽然我可以声明类型List<List<Double>>的函数参数,但是我在创建实际实例时遇到了麻烦,因为我需要创建一个具体类的实例,例如ArrayList

我试过

List<? extends List<Double>> inputs = new ArrayList<List<Double>>();
inputs.add(new ArrayList<Double>());

List<? extends List<? extends Double>> inputs = new ArrayList<List<Double>>();
inputs.add(new ArrayList<Double>());

但在这两种情况下,我在调用add()时遇到编译错误,说该方法不适用于ArrayList<Double>类型的参数

这有效

List<List<Double>> inputs = new ArrayList<List<Double>>();
inputs.add((List<Double>) new ArrayList<Double>());

但是必须以这种方式使用演员表才是丑陋的。有更好的方法吗?

3 个答案:

答案 0 :(得分:7)

你可以省略演员表,因为这个完全有效。每个ArrayList都是一个List。

List<List<Double>> inputs = new ArrayList<List<Double>>();
inputs.add(new ArrayList<Double>());

答案 1 :(得分:3)

你误解了通配符的含义。 <? extends List>并不意味着“扩展列表的任何内容”,这意味着“扩展列表的某些特定内容,但我们不知道它是什么。”因此,将ArrayList添加到其中是违法的,因为我们不知道ArrayList是否是此集合中的特定内容。

只是简单地说:

  List<List<Double>> list = new ArrayList<List<Double>>();
  list.add(new ArrayList<Double>());

工作正常

答案 2 :(得分:0)

决定应声明哪种类型时有两种截然不同的情况:

1)在公共界面中。使用适当的抽象类型。

    public List<List<Double>> querySomething();

2)作为实施细节。使用具体类型

    ArrayList<ArrayList<Double>> list = new ArrayList<ArrayList<Double>>();

我猜你是第二个案子。