尽管语法相似,但泛型和数组在 Java 中的行为不同。本文深入研究了创建泛型数组的复杂性,解释了其局限性背后的根本原因,并为特定场景提供了解决方法。
数组是具体化的,这意味着它们的类型信息在运行时可用。另一方面,泛型在编译期间被删除,在运行时删除它们的类型信息。这种区别导致了处理泛型类型和数组的不同规则。
协方差和类型检查:数组表现出协方差,允许诸如对象[] arr = 新字符串[10]。然而,泛型不继承此属性,呈现诸如 List
类型安全和运行时错误: 泛型在编译时强制执行以防止运行时错误。由于泛型数组在运行时没有类型信息,因此它们的创建可能会导致未经检查的类型不安全行为。
类型不安全行为示例:
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] 转换为 E[] E[] elements = (E[]) new Object[10] 似乎可行,但这是一种危险的方法。强制转换未经检查,这意味着编译器不保证其有效性。在运行时,生成的数组将是一个 Object[],如果添加类型不兼容的元素,可能会导致运行时错误。
可具体化类型的数组,例如原始数组类型(例如,List[])或无界通配符类型(例如,List>[])可以毫无问题地创建。这是因为可具体化的类型在运行时具有可用的类型信息。但是,禁止创建不可具体化类型的数组,例如通用数组类型(例如 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中文网其他相关文章!