如何创建固定大小List实例?替换set为add无编译错误原因
问题1:如何创建固定大小、支持
set()但不支持add()的List实例? - 使用
Arrays.asList()方法:这是最常用的实现方式,比如你代码里的List<SudokuField> fields = Arrays.asList(new SudokuField[9])。该方法返回的是java.util.Arrays.ArrayList(注意不是java.util.ArrayList),它是一个固定大小的List实现,底层直接复用传入的数组。- 支持
set()操作:因为本质是修改底层数组对应位置的元素; - 不支持
add()、remove()等修改List大小的操作:调用这些方法会直接抛出UnsupportedOperationException,因为底层数组长度固定,无法扩容或缩容。
- 支持
- 注意:如果通过数组传入创建该List,List和原数组是关联的,调用
set()修改List元素时,原数组的对应元素也会被修改,反之亦然。
问题2:替换代码为
fields.add(new SudokuField())未出现编译错误的原因? Java编译阶段仅检查变量的声明类型,不关心运行时的实际实现类:
- 你的代码中
fields的声明类型是List<SudokuField>,而List接口中定义了add()方法,因此编译器认为调用add()是合法的,不会触发编译错误。 - 但运行时,
fields的实际实例是Arrays.asList()返回的Arrays.ArrayList,这个类没有重写add()方法,它继承自AbstractList,而AbstractList中的add()默认实现就是直接抛出UnsupportedOperationException。所以这段代码能编译通过,但运行时会触发该异常。
内容的提问来源于stack exchange,提问作者jano
相关产品推荐
相关产品推荐

