java - 通用数组初始化

标签 java arrays generics erasure

我已经阅读了不同的文章,其中讨论了为什么我们不能在 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[] 但是,在您的代码中,它返回 arrString[] 类型。这就是您的代码中没有 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/

相关文章:

java - 什么时候在java中加载导入的类?

java - 设置以毫秒为单位的天数格式

javascript - 谷歌应用脚​​本: How to remove specific characters from a 2D array

python - 创建 numpy 数组时 dtype=object 是什么意思?

使用泛型的 C# 存储库

java - 我怎样才能向下转换为 E 类类型,或者至少在没有警告的情况下以安全的方式进行转换?

CPU 负载中的 Java 多线程

Java初始化对象

python - 根据Python中的另一个字典列表对字典列表进行排序

java - 按通用属性的属性对对象进行排序