3

我已经阅读了不同的文章,这些文章谈到了为什么我们不能在 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类型,所以编译器可以创建对象类型的数组。

还有其他类似解释的帖子,但不能真正解决我的疑问。

请帮忙!

4

1 回答 1

1

擦除后,getStringArr 应该返回 Object[],并且可以毫无问题地转换为 String[]。

的返回类型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[].

于 2021-09-25T11:33:50.033 回答