Java Iterable <iterable <t>&gt;到ArrayList <arraylist <t>&gt; </arraylist <t> </iterable <t>

时间:2011-02-17 15:37:24

标签: java generics iterator

也许我错过了一些东西,但我想如果我这样宣布我的课程:

public class Something<T> implements Iterable<Iterable<T>> {
  public Something(Iterable<Iterable<T>> input) {
  ...

我应该能够实例化它:

ArrayList<ArrayList<String>> l = new ArrayList<ArrayList<String>>();

Something<String> s = Something<String>(l);

不幸的是,这给我一个错误。我认为ArrayLists是可迭代的,因此应该完全映射到我的构造函数定义。

2 个答案:

答案 0 :(得分:7)

您需要修改构造函数以接受任何扩展Iterable<T>

的内容
public Something(Iterable<? extends Iterable<T>> list){}

原因是泛型类型无法真正扩展其他泛型类型。无法将List<String>分配给List<CharSequence>。关键字extends允许进行此类分配。

答案 1 :(得分:1)

使用泛型进行子类型非常不直观。对于你想要做的事情,你需要通配符,这将是非常难看的。

第3节 - http://java.sun.com/j2se/1.5/pdf/generics-tutorial.pdf

中有一个很好的解释