【问题标题】:How to assign an ArrayList<ArrayList<ClsA>> type object to List<List<ClsASuper>> variable in Java如何在 Java 中将 ArrayList<ArrayList<ClsA>> 类型对象分配给 List<List<ClsASuper>> 变量
【发布时间】:2011-06-23 16:51:12
【问题描述】:

要通过合同或接口编程,我定义了一个这样的类:

public ClsOne{
    private List<IntfA> fieldA;
    public setFieldA(List al);
}
public ClsA implements IntfA{...}

然后在其他地方,我们可以写:

....
ArrayList<ClsA> alist = new ArrayList<ClsA>();
ClsOne one = new ClsOne();
one.setFieldA(alist); 

但是,这似乎不适用于嵌入式容器:

public ClsTwo{
    private List<List<IntfA>> fieldA;
    public setFieldA(List<List<IntfA>> al);
}
public ClsA implements IntfA{...}

因为下面的代码不正确:

ArrayList<ArrayList<ClsA>> aalist = new ArrayList<ArrayList<ClsA>>();
 ClsOne one = new ClsOne();
one.setFieldA(aalist);

那么,在这种情况下,在 ClsA 的定义中,有什么办法可以隐藏具体的容器类型吗?

【问题讨论】:

  • 编译错误?运行时错误?您遇到的错误是什么
  • 我认为您可以通过说类似 List。试试看。
  • 您是否需要列表列表?也许不同的数据结构会更有效。例如可能是 Map>
  • @RMT 编译错误。类型不合适。
  • @John Kane ,我只想保留一个路径列表,每个路径都有一个节点列表,要使用 Map,我必须为每个路径生成另一个元素作为键。

标签: java types containers


【解决方案1】:

您可以实例化一个包含List&lt;ClsA&gt; 类型对象的ArrayList

ArrayList<List<ClsA>> aalist = new ArrayList<List<ClsA>>();
ClsOne one = new ClsOne();
one.setFieldA(aalist);

【讨论】:

  • 您最好将aalist 设为List&lt;List&lt;ClsA&gt;&gt;,以避免出现此类问题。
  • @starblue 绝对是,这就是我会做的——但回答这个问题并不是绝对必要的
【解决方案2】:
public setFieldA(List<? extends List<? extends IntfA>> al);

应该可以。 Java 泛型是草率且令人困惑的,而且没有多大意义。

如果您需要解释,请阅读here。我宁愿只使用更好的语言。

【讨论】:

    猜你喜欢
    • 2015-08-11
    • 2013-02-05
    • 1970-01-01
    • 2012-06-15
    • 2015-07-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-31
    相关资源
    最近更新 更多