我正在编写一些需要处理任意数量的双精度列表的代码。但是,虽然我可以声明类型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>());
但是必须以这种方式使用演员表才是丑陋的。有更好的方法吗?
答案 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>>();
我猜你是第二个案子。