📅  最后修改于: 2023-12-03 15:31:34.122000             🧑  作者: Mango
在 Java 中,泛型数组是一种具有特殊行为的数组类型。它们与普通数组不同,能够让程序员在数组中存储不同类型的元素。
Java 泛型数组的语法看起来非常简单:
SomeType[] array = new SomeType[size];
其中,SomeType
可以是任何 Java 类型,如 Integer
、String
或自定义类。
但是,这个看起来简单的语法实际上是有问题的。在 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 泛型数组是一种可以存储不同类型元素的数组类型。但是,由于数组是协变的,使用泛型数组需要小心操作。我们可以使用类型通配符来限制数组中的元素类型,并避免将一个元素插入到错误类型的数组中。