我试图将不可修改的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来支持随机访问。还有其他方法可以完成它吗?感谢您提前提供任何帮助
答案 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方法来包装该临时副本。