繁体   English   中英

"有没有办法将不可变列表转换为可变列表?"

[英]is there a way to convert an immutable list to a mutable one?

所以我想创建一个方法来将元素添加到不可变列表中,但我有点需要它是一个可变列表,以便在最后返回。 到目前为止,我已经创建了不可变列表的可变副本:

Grid2D add(int elem) {
          List<Integer> newlist = new ArrayList<Integer>();
          for (int i = 0; i < this.list.size(); i++) {
              newlist.add(list.get(i));
          }   
          newlist.add(elem);
          return new Grid2D(newlist, this.numOfCols);
}   

有没有办法将不可变列表转换为可变列表?

<\/blockquote>

简短的回答是没有办法。

长答案是,这取决于您将“转换”为可变的意思。

显然,您可以创建不可变列表1<\/sup>的可变副本。 但缺点是可变列表是一个不同的列表。 复制后对不可变列表所做的更改不会反映在新列表中。 反之亦然。

如果您要“破解”不可变列表抽象,则可能会对其<\/em>进行变异。 (涉及到令人讨厌的反射,你需要知道具体的不可变列表类是如何实现的。)但这是一个非常糟糕的主意。 您的应用程序代码库的各个部分将假设不可变集合是不可变的。 违反不变量可能会使各种事情的行为不正确。

最后,如果“不可变列表”最初是使用Collections.unmodifiableList<\/code>创建的,则它不是严格不可变的。 您可以通过修改由unmodifiableList<\/code>调用包装的原始列表来修改它。


1 - 您不一定需要为此使用ArrayList<\/code> 。<\/sup> 您可以使用任何List<\/code>实现类,包括您从头开始编写的自定义实现。<\/sup> 但是您确实<\/em>需要使用new<\/code>来创建一个新的List<\/code>实例。<\/sup>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM