我已经阅读了不同的文章,这些文章谈到了为什么我们不能在 java 中创建泛型数组,但我仍然不太明白为什么。
例如,在这篇文章中,它假设如果通用数组初始化是可能的,那么在擦除后将会出现强制转换问题。您可以在第2 节中找到详细信息。使用通用数组时的注意事项。简单来说,泛型数组擦除后变成了一个对象数组,如果泛型类型是String,java将无法将Object[]转换为String[]。
但是,我创建了一个具有简单函数的泛型类,
// Test.java
public class Test<T> {
public T[] getStrArr(T[] arr) {
return arr;
}
}
//Main.java
public static void main(String[] args) {
Test<String> test = new Test<>();
String[] strArr = test.getStrArr(new String[]{"A", "B", "C"});
}
擦除后,getStringArr 应该返回 Object[],并且可以毫无问题地转换为 String[]。
另一个stackoverflow帖子指出:
数组(与泛型不同)在运行时包含有关其组件类型的信息。所以在创建数组的时候一定要知道组件的类型。由于您在运行时不知道 T 是什么,因此您无法创建数组。
但是擦除会T
变成Object
类型,所以编译器可以创建对象类型的数组。
还有其他类似解释的帖子,但不能真正解决我的疑问。
请帮忙!