解决 Java 中 Generic Array Creation 错误
本篇文章通过代码示例说明了 generic array creation 错误,并重点介绍了创建通用数组时出现此错误的原因。 本次讨论将得出解决方案,我们将学习如何使用对象数组和反射功能创建通用数组。
Java中 Generic Array Creation 错误的演示
示例代码(DemoGenArray.java 类):
import java.util.Arrays;
public class DemoGenArray<T> {
private T[] genericArray;
DemoGenArray(int size) {
genericArray = new T[size];//<----This Line Has Generic Array Creation Error
}
public T get(int index) {
return (T) genericArray[index];
}
public void set(int index, T item) {
genericArray[index] = item;
}
@Override
public String toString() {
return Arrays.toString(genericArray);
}
}
在此类中,我们尝试创建并初始化具有指定数组大小的通用数组。 此外,我们将元素添加到数组中,并从给定索引中单独返回项目。
toString()
立即返回整个数组。
问题是我们在构造函数中指出的行出现了通用数组创建错误。 让我们探讨一下导致此错误的可能原因,这将有助于我们找到解决方案。
Java 中 generic array creation 错误的可能原因
我们试图在代码中创建一个通用数组,这在 Java 中是不可能的。 这是因为 Java 有意识地决定显式地停止这些语法的工作。
请记住,在 Java 中数组是协变的(我们可以将子类型分配给其超类型引用),而泛型则不然。
private T[] genericArray;
genericArray = new T[size];
上面两行代码与下面给出的代码相同。 您可以使用其中任何一个。
private T[] genericArray = new T[size];
这是由于 Java 实现的类型擦除而发生的。 它是由Java编译器执行的一个过程。
它删除泛型中的参数化类型并将它们映射到字节代码中的原始类型。
请记住,字节码没有任何有关泛型的详细信息。 使用类型 T 在编译时没问题,但在运行时没有任何意义。
通过其他方式,我们可以通过下面的代码示例来规避此限制。 下面让我们逐一了解一下。
消除 Java 中 generic array creation 错误的可能解决方案
我们已经知道,编译器在运行时没有任何有关参数化类型的信息。 因此,每当我们需要使用泛型时,最好优先使用 Java Collections 框架的列表组件,而不是使用数组。
然而,我们仍然可以创建类似数组的泛型结构,但这个解决方案取决于它是选中还是未选中。 如果未选中,我们将使用对象数组。
在勾选的情况下,我们可以使用Java的reflect功能。 让我们看看它们各自是如何工作的。
解决方案1:使用对象数组
示例代码(DemoGenArray.java 类):
import java.util.Arrays;
public class DemoGenArray<T> {
private Object[] genericArray;
DemoGenArray(int size) {
genericArray = new Object[size];
}
public T get(int index) {
return (T) genericArray[index];
}
public void set(int index, T item) {
genericArray[index] = item;
}
@Override
public String toString() {
return Arrays.toString(genericArray);
}
}
示例代码(GenArray.java 类)
public class GenArray {
public static void main(String[] args) {
DemoGenArray<String> strArray = new DemoGenArray(3);
strArray.set(0, "one");
strArray.set(1, "two");
strArray.set(2, "three");
DemoGenArray<Integer> intArray = new DemoGenArray(3);
intArray.set(0, 10);
intArray.set(1, 20);
intArray.set(2, 30);
DemoGenArray<Double> doubleArray = new DemoGenArray(3);
doubleArray.set(0, 15.0);
doubleArray.set(1, 110.0);
doubleArray.set(2, 10.0);
System.out.println("Integer Array: " + intArray);
System.out.println("String Array: " + strArray);
System.out.println("Double Array: " + doubleArray);
}
}
输出:
Integer Array: [10, 20, 30]
String Array: [one, two, three]
Double Array: [15.0, 110.0, 10.0]
这里,我们使用 Object 数组来模拟通用数组,因为 DemoGenArray 类是未选中的(弱类型)。 如果我们知道不会对作为参数传递的对象执行类型检查,则可以使用此方法。
此外,我们使用通用的 get()
和 set()
方法分别返回值和设置值。 get()
方法使用显式转换为 T,其中 T 充当泛型的占位符并表示任何值/元素。
如果我们使用 set()
和 get()
方法并且不让用户直接访问对象数组,则效果很好。 来到 GenArray 类,其中包含 main()
方法。
在这里,我们创建 DemoGenArray 类的实例。
我们在实例化 DemoGenArray 类并填充它们时传递所需的类型。 之后,我们使用 toString() 方法写入所有实例的内容。
解决方案2:使用reflect功能
示例代码(DemoGenArray.java 类):
import java.lang.reflect.Array;
import java.util.Arrays;
public class DemoGenArray<T> {
private T[] genericArray;
DemoGenArray(Class<T> classType, int size) {
genericArray = (T[]) Array.newInstance(classType, size);
}
public T get(int index) {
return (T) genericArray[index];
}
public void set(int index, T item) {
genericArray[index] = item;
}
@Override
public String toString() {
return Arrays.toString(genericArray);
}
}
示例代码(GenArray.java 类):
public class GenArray {
public static void main(String[] args) {
DemoGenArray<String> strArray = new DemoGenArray(String.class, 3);
strArray.set(0, "one");
strArray.set(1, "two");
strArray.set(2, "three");
DemoGenArray<Integer> intArray = new DemoGenArray(Integer.class, 3);
intArray.set(0, 10);
intArray.set(1, 20);
intArray.set(2, 30);
DemoGenArray<Double> doubleArray = new DemoGenArray(Double.class, 3);
doubleArray.set(0, 15.0);
doubleArray.set(1, 110.0);
doubleArray.set(2, 10.0);
System.out.println("Integer Array: " + intArray);
System.out.println("String Array: " + strArray);
System.out.println("Double Array: " + doubleArray);
}
}
输出:
Integer Array: [10, 20, 30]
String Array: [one, two, three]
Double Array: [15.0, 110.0, 10.0]
在这里,我们使用反射类来创建通用数组,其类型仅在运行时才知道。 此解决方案与解决方案 1 类似,但 DemoGenArray 类中有两处不同。
首先,我们在 DemoGenArray 类中有一个构造函数,它接受两个参数:数组的类型和大小。 其次,我们使用 Array.newInstance()
方法初始化 genericArray。
Array.newInstance()
方法使用给定的维度(数组的大小)和组件类型创建一个新数组。
相关文章
修复 Class X Is Public Should BeDeclared in a File Named X.java 错误
发布时间:2023/07/12 浏览次数:192 分类:Java
-
我们将经历各个阶段,从演示一个编译时错误开始,该错误指出类 X 是公共的,应该在名为 X.java 的文件中声明。 class X is public, should be declared in a file named X.java 的原因 然后,我们将看到导致此
Java 错误 Could Not Reserve Enough Space for Object Heap Minecraft
发布时间:2023/07/11 浏览次数:125 分类:Java
-
本篇文章介绍了 Java 中的 Could not reserve enough space for object heap 错误。Minecraft 是一款非常流行的用 Java 开发的游戏,我们需要 Java 来运行它。Java 中Minecraft 错误Could not reserve enough space for object h
Java 错误 Cannot Determine a Valid Java Home
发布时间:2023/07/11 浏览次数:149 分类:Java
-
本篇文章介绍了 Java 中的 cannot determine a valid java home 错误。当 Java Home 路径设置不正确时,会出现 cannot determine a valid java home 错误。 我们必须按照以下步骤正确设置我们的 Java Home 来解决这个问
Java 错误 SunCertPathBuilderException: Unable to Find Valid Certification Path
发布时间:2023/07/11 浏览次数:164 分类:Java
-
本篇文章将讨论 unable to find valid certification path to requested target 潜在原因及其在 Java 中的解决方案。Java中的sun.security.provider.certpath.SunCertPathBuilderException是什么
Java 错误 Class Expected
发布时间:2023/07/11 浏览次数:66 分类:Java
-
在本文中,我们将研究 Java 中的“.class” expected错误是什么。“.class” expected错误是编译时错误。 有些人可能会感到困惑,因为他们认为这是一个运行时错误,但这是错误的。
Java 错误 Constructor Is Undefined
发布时间:2023/07/11 浏览次数:192 分类:Java
-
本文将研究 Java 的错误,constructor not defined。Java 中的constructor not defined错误 构造函数未定义是一个非常常见的错误。
修复 Java 错误 Java.Net.SocketException: Permission Denied
发布时间:2023/07/11 浏览次数:124 分类:Java
-
本篇文章介绍了 Java 中的 java.net.SocketException:Permission denied 错误。Java中出现 java.net.SocketException: Permission returned 错误的原因 SocketException 通常在网络连接出现问题时发生。
修复 Java 错误 $' ': Command Not Found
发布时间:2023/07/11 浏览次数:63 分类:Java
-
本篇文章介绍了 Java 中的 $'\r': command not found 错误。Java 中 $'\r': command not found 的原因当我们尝试在 Cygwin 等平台的 Linux 平台上运行 Unix 风格的命令时,会出现错误 $'\r': command not find 。
解决 Java 错误 Unreachable Statement
发布时间:2023/07/11 浏览次数:176 分类:Java
-
本篇文章介绍了 Java 中的 unreachable statement 错误。Java中出现 unreachable statement 错误的原因 当我们尝试在分支控制流语句之后放置语句时,会发生不可到达语句错误。