首页 > Java > java教程 > 为什么我无法在 Java 中创建泛型数组,解决方法是什么?

为什么我无法在 Java 中创建泛型数组,解决方法是什么?

Mary-Kate Olsen
发布: 2024-12-05 01:28:14
原创
955 人浏览过

Why Can't I Create Generic Arrays in Java, and What Are the Workarounds?

创建泛型数组:探索难题

简介

尽管语法相似,但泛型和数组在 Java 中的行为不同。本文深入研究了创建泛型数组的复杂性,解释了其局限性背后的根本原因,并为特定场景提供了解决方法。

泛型和数组:根本区别

数组是具体化的,这意味着它们的类型信息在运行时可用。另一方面,泛型在编译期间被删除,在运行时删除它们的类型信息。这种区别导致了处理泛型类型和数组的不同规则。

泛型数组创建的限制

协方差和类型检查:数组表现出协方差,允许诸如对象[] arr = 新字符串[10]。然而,泛型不继承此属性,呈现诸如 List 之类的分配。 list = new ArrayList() 无效。

类型安全和运行时错误: 泛型在编译时强制执行以防止运行时错误。由于泛型数组在运行时没有类型信息,因此它们的创建可能会导致未经检查的类型不安全行为。

类型不安全行为示例:

public <T> T[] getArray(int size) {
    T[] arr = new T[size];  // This would be allowed if generic array creation was permitted.
    return arr;
}

Integer[] arr = getArray(10); // Assigns an Object[] to Integer[] reference, leading to a runtime error.
登录后复制

为什么类型转换适用于 new Object[10]

将 new Object[10] 转换为 E[] E[] elements = (E[]) new Object[10] 似乎可行,但这是一种危险的方法。强制转换未经检查,这意味着编译器不保证其有效性。在运行时,生成的数组将是一个 Object[],如果添加类型不兼容的元素,可能会导致运行时错误。

为可具体化类型创建数组

可具体化类型的数组,例如原始数组类型(例如,List[])或无界通配符类型(例如,List>[])可以毫无问题地创建。这是因为可具体化的类型在运行时具有可用的类型信息。但是,禁止创建不可具体化类型的数组,例如通用数组类型(例如 E[])。

创建 E[] 数组的解决方法

绕过限制对于通用数组创建,可以使用以下解决方法:

public <E> E[] getArray(Class<E> clazz, int size) {
    @SuppressWarnings("unchecked")
    E[] arr = (E[]) Array.newInstance(clazz, size);
    return arr;
}
登录后复制

此方法利用 Class#newInstance 方法,该方法提供了创建给定可具体化类型的数组的类型安全方法。

结论

由于底层类型安全和运行时行为考虑,通用数组创建在 Java 中受到限制。虽然存在创建可具体化类型数组的解决方法,但在设计和实现通用代码时,请务必注意使用这些解决方法的限制和潜在影响。

以上是为什么我无法在 Java 中创建泛型数组,解决方法是什么?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板