也许我错过了一些东西,但我想如果我这样宣布我的课程:
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是可迭代的,因此应该完全映射到我的构造函数定义。
答案 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
中有一个很好的解释