📜  java 泛型数组 - Java (1)

📅  最后修改于: 2023-12-03 15:31:34.122000             🧑  作者: Mango

Java 泛型数组

在 Java 中,泛型数组是一种具有特殊行为的数组类型。它们与普通数组不同,能够让程序员在数组中存储不同类型的元素。

基础

Java 泛型数组的语法看起来非常简单:

SomeType[] array = new SomeType[size];

其中,SomeType 可以是任何 Java 类型,如 IntegerString 或自定义类。

但是,这个看起来简单的语法实际上是有问题的。在 Java 中,数组是协变的,这意味着你可以将子类对象赋给父类引用类型的数组。但是,如果我们尝试将子类对象赋给泛型数组,编译器将抛出编译时错误。

为了解决这个问题,Java 引入了类型通配符。在 Java 中,类型通配符使用 ? 表示,它允许我们使用不确定的类型来声明泛型数组:

List<?>[] array = new List<?>[size];

这个代码片段展示了如何声明一个 List 类型的泛型数组。<?> 表示一个未知的通配符类型,可以存储任何类型的列表。

泛型数组的使用

泛型数组可以用来存储任何类型的元素。例如,我们可以在数组中存储整数、字符串、自定义类等等:

List<Integer>[] intLists = new List[10];
List<String>[] strLists = new List[10];
List<MyClass>[] classLists = new List[10];

在使用泛型数组时,我们需要小心操作。由于泛型数组可以包含任何类型的元素,我们不能将一个元素插入另一个泛型数组中。例如,下面的代码将引发编译时错误,因为它尝试将一个字符串数组插入到一个整数数组中:

Integer[] intArray = new Integer[10];
String[] strArray = new String[10];
Object[] objectArray = new Object[2];
objectArray[0] = intArray;
objectArray[1] = strArray; // 编译时错误

为了避免这个问题,我们可以使用通配符来限制泛型数组的类型。例如,下面的代码使用 List<?> 声明了一个泛型数组,它只能存储列表类型的元素:

List<?>[] array = new List<?>[10];
array[0] = new ArrayList<Integer>(); // 合法
array[1] = new ArrayList<String>(); // 合法
array[2] = new LinkedList<Integer>(); // 合法
array[3] = new LinkedList<String>(); // 合法
array[4] = new ArrayList<Object>(); // 编译时错误
总结

Java 泛型数组是一种可以存储不同类型元素的数组类型。但是,由于数组是协变的,使用泛型数组需要小心操作。我们可以使用类型通配符来限制数组中的元素类型,并避免将一个元素插入到错误类型的数组中。