有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java将ArrayList转换为不可修改的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_字段来支持随机访问。还有其他方法可以实现吗?提前谢谢你的帮助


共 (2) 个答案

  1. # 1 楼答案

    出现错误的原因是Collections.unmodifiablelist(exList)返回一个列表,您要做的是

    ArrayList<T> EX_FIELDS=(ArrayList<T>)List<T>();
    

    列表是一个接口,无法实例化。EX_FIELDS变量只能存储ArrayList对象,因此出现classcast异常错误

    正确的方法是:

    List<String> EX_FIELDS=Collections.unmodifiablelist(exList)
    
  2. # 2 楼答案

    你会得到一个ClassCastException,因为Collections.unmodifiableList()不返回ArrayList,它返回一个List<T>(接口),它可以是实现List接口的任何支持类。从异常中可以看到,实际上是返回一个UnmodifiableRandomAccessList

    创建变量EX_FIELDS时,应该像

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

    也就是说,EX_FIELDS是一个列表,您已经为实际实例选择了一个数组列表。以后你会做的

    EX_FIELDS = Collections.unmodifiableList(exList);
    

    unmodifiableList()返回一个列表,但只要它符合列表接口,您就不在乎它实际上是什么类型的