迹忆客 专注技术分享

当前位置:主页 > 学无止境 > 编程语言 > Java >

解决 Java 中 Generic Array Creation 错误

作者:迹忆客 最近更新:2023/07/11 浏览次数:

本篇文章通过代码示例说明了 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() 方法使用给定的维度(数组的大小)和组件类型创建一个新数组。

转载请发邮件至 1244347461@qq.com 进行申请,经作者同意之后,转载请以链接形式注明出处

本文地址:

相关文章

修复 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 错误 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 错误的原因 当我们尝试在分支控制流语句之后放置语句时,会发生不可到达语句错误。

扫一扫阅读全部技术教程

社交账号
  • https://www.github.com/onmpw
  • qq:1244347461

最新推荐

教程更新

热门标签

扫码一下
查看教程更方便