我已经阅读了不同的文章,其中讨论了为什么我们不能在 java 中创建泛型数组,但我仍然不太明白为什么。
例如,它是 post ,假设如果可以进行通用数组初始化,则删除后会出现转换问题。您可以在 2. Considerations When Using Generic Arrays 部分找到详细信息.简单来说,泛型数组在删除后变成了Object Array,如果泛型类型是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 post表示:
数组(与泛型不同)在运行时包含有关其组件类型的信息。所以在创建数组的时候一定要知道组件类型。由于在运行时不知道 T 是什么,因此无法创建数组。
但是删除会将T
变为Object
类型,因此编译器可以创建Object 类型的数组。
还有其他帖子也有类似的解释,但不能真正解决我的疑问。
请帮忙!
最佳答案
After erasure, the getStringArr should return Object[], and it is able to cast to String[] without any problem.
getStrArr
的返回类型,在类型删除之后,将是 Object[]
但是,在您的代码中,它返回 arr
是 String[]
类型。这就是您的代码中没有 ClassCastException
的原因。
考虑以下方法(假设允许泛型数组):
public T[] foo() {
return new T[5];
}
类型删除后,new T[5]
将被替换为 new Object[5]
。现在,如果调用代码将此方法调用为:
String[] strArr = obj.foo();
这将导致 ClassCastException
,因为 Object[]
无法转换为 String[]
。
关于java - 通用数组初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69325358/