将ArrayList转换为不可修改的ArrayList

时间:2017-03-15 19:16:13

标签: java arraylist

我试图将不可修改的ArrayList变为最终变量EX_FIELDS。 exList是一个现有的ArrayList对象。

EX_FIELDS = (ArrayList<String>) Collections.unmodifiableList(exList);

此代码存在于静态块中。当类加载时,我收到以下错误。

java.lang.ClassCastException: java.util.Collections$UnmodifiableRandomAccessList cannot be cast to java.util.ArrayList

我需要使用EX_FIELDS来支持随机访问。还有其他方法可以完成它吗?感谢您提前提供任何帮助

3 个答案:

答案 0 :(得分:9)

List<String>应该有ArrayList<String>类型,而不是EX_FIELDS = Collections.unmodifiableList(exList); ,你不应该做任何演员:你应该写一下

{{1}}

这是一个更通用的规则的一个实例,你应该编程到接口,而不是实现。

答案 1 :(得分:2)

你得到一个ClassCastException,因为Collections.unmodifiableList()没有返回一个ArrayList,它返回一个List<T>(接口),它可以是实现List接口的任何后备类。正如您从异常中看到的那样,实际返回UnmodifiableRandomAccessList

创建变量EX_FIELDS时,应将其声明为

List<String> EX_FIELDS = new ArrayList<>();

也就是说,EX_FIELDS是 List ,您为实际实例选择了 ArrayList 。稍后你会做

EX_FIELDS = Collections.unmodifiableList(exList);

unmodifiableList()会返回列表,但您并不关心实际是什么类型,只要它符合列表界面。

答案 2 :(得分:0)

其他答案是正确的,但缺少关键点:以这种方式创建的不可修改列表仍然可以修改。

对Collections类的这一调用会创建一个包装器对象,该对象包含所提供的 exList 参数。

换句话说:当exList更改时,您的包装列表也会更改。

因此,当您想要确定时,您必须首先创建一个新的临时列表,您可以在其中添加 exList 的所有条目;然后使用该Collections方法来包装该临时副本。