You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何创建固定大小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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 13:44:52