关于Java中ArrayList<int>合法性及泛型数组实例化的疑问
关于Java泛型与数组的问题解答
背景代码
普林斯顿评论2022版《AP计算机科学A备考》一书中的例题包含如下代码:
public class Screen { private ArrayList<int>[] data; ... }
针对这段代码,提出以下两个问题并解答:
问题1:是否存在某个Java版本使得ArrayList<int>是合法写法?
不存在任何Java版本支持ArrayList<int>这种写法。Java泛型的类型参数仅接受引用类型,int作为基本数据类型无法直接作为泛型参数,必须使用对应的包装类Integer,即ArrayList<Integer>才是合法语法。你在Java 17、21版本中遇到的unexpected type错误是正常的,这说明教材此处存在错误。
问题2:若定义为ArrayList<Integer>[] data,如何正确实例化?
Java确实禁止直接创建泛型数组(new ArrayList<Integer>[10]会触发generic array creation错误),有两种合法的解决方式:
- 方式一:非泛型数组+类型转换
创建一个原始类型的数组后,强制转换为目标泛型数组类型,代码如下:
data = (ArrayList<Integer>[]) new ArrayList[10];
这种写法会产生未检查转换的编译警告,但只要确保数组中仅存放ArrayList<Integer>类型元素,实际使用是安全的。
- 方式二:改用嵌套集合
如果业务场景允许,使用ArrayList<ArrayList<Integer>>替代泛型数组更符合Java泛型设计规范,无需类型转换,写法示例:
private ArrayList<ArrayList<Integer>> data; // 实例化并初始化10个空的ArrayList<Integer> data = new ArrayList<>(); for (int i = 0; i < 10; i++) { data.add(new ArrayList<>()); }
内容的提问来源于stack exchange,提问作者Fully Buzzword Compliant
相关产品推荐
相关产品推荐

