【问题标题】:Java Iterable<Iterable<T>> to ArrayList<ArrayList<T>>Java Iterable<Iterable<T>> 到 ArrayList<ArrayList<T>>
【发布时间】:2011-02-17 15:37:24
【问题描述】:

也许我遗漏了一些东西,但我认为如果我这样声明我的班级:

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 是可迭代的,因此应该完全映射到我的构造函数定义。

【问题讨论】:

    标签: java generics iterator


    【解决方案1】:

    您需要修改构造函数以接受任何扩展 Iterable&lt;T&gt;

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

    这是因为泛型类型不能从字面上扩展其他泛型类型。 List&lt;String&gt; 不能分配给 List&lt;CharSequence&gt;。关键字extends 允许发生这种类型的赋值。

    【讨论】:

    • 谢谢,但现在我在这里收到警告:public class Something&lt;T&gt; implements Iterable&lt;Iterable&lt;T&gt;&gt; { private Iterable&lt;Iterable&lt;T&gt;&gt; input; public Something(Iterable&lt;? extends Iterable&lt;T&gt;&gt; input) { this.input = (Iterable&lt;Iterable&lt;T&gt;&gt;)input; }
    • 我建议找一本 Josh Bloch 撰写的 Effective Java 的副本,然后阅读“PECS”。它将帮助您真正了解正在发生的事情。在任何情况下,您都需要在您希望分配ArrayList&lt;ArrayList&lt;String&gt;&gt; 的任何地方都有Iterable&lt;? extends Iterable&lt;T&gt;
    • 或者甚至Iterable&lt;? extends Iterable&lt;? extends T&gt;&gt;
    【解决方案2】:

    使用泛型进行子类型化非常不直观。对于你想要做的事情,你需要通配符,这会很丑陋。

    第 3 节中有一个很好的解释 - http://java.sun.com/j2se/1.5/pdf/generics-tutorial.pdf

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-08-13
      • 1970-01-01
      • 1970-01-01
      • 2011-08-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-21
      相关资源
      最近更新 更多