【问题标题】:How to create an array of generic objects to be used for a Hash Table?如何创建用于哈希表的通用对象数组?
【发布时间】:2020-11-23 04:23:41
【问题描述】:

所以,我有三个类 HashTestHashTableHashObject。 HashTest 的目的是使用三种不同的输入源来测试 HashTable:Integers、Longs 和 Strings。

根据指定的来源,我将分别创建一个 HashTable 对象,并开始插入元素。

在我的 HashTable 类中,我必须使用一个数组,该数组将填充给定类型的 HashObject。我的问题出现了,我尝试创建一个数组并用通用对象填充它。最初我在我的 HashTable 类中使用了以下声明来尝试创建一个 HashObjects 数组:

private HashObject<G>[] table = (HashObject<G>)new Object[95957];

这将编译,并带有未经检查的强制转换的警告,但是当我运行时,我最终会抛出 ClassCastException。我不完全确定为什么会得到这个 ClassCastException(下面的确切错误),但我知道这与我声明一个泛型类型的数组并尝试将对象初始化转换为泛型类型这一事实有关。如果我错了,请纠正我。

ClassCastException 消息

Exception in thread "main" java.lang.ClassCastException: class [Ljava.lang.Object; cannot be cast to class [LHashObject; ([Ljava.lang.Object; is in module java.base of loader 'bootstrap'; [LHashObject; is in unnamed module of loader 'app')
        at HashTable.<init>(HashTable.java:3)
        at HashTest.main(HashTest.java:28)

在实验的时候我改变了我在HashTest中创建HashTable对象的方式,使得传递给HashTable的参数是>,然后我在HashTable中声明一个G[]数组并进行强制转换在我的初始化中到 G[]:

private G[] table = (G[])new Object[95957];

这消除了我的 ClassCastException,但是,在我的代码中,我不再能够使用我的 HashObject 方法,因为“未确定”数据类型 G 不存在这些方法。

((G)table[currIndex]).incrementDuplicates();

上述方法不起作用,因为 incrementDuplicates() 方法“对于 G 类型是未定义的”。

我寻求帮助的地方是,是否有不同的方式来声明该数组,以便我能够在其中存储 HashObject,或者是否有不同的方式来调用 HashObjects 方法,而每个元素都被初始化为 Object .

【问题讨论】:

  • 注意:您应该非常谨慎地抑制警告,但构建通用容器(在 Java 中通常意味着您需要某种 Object[])是必要的情况之一。您有责任确保一致地处理您的数据类型;如果不这样做,可能会导致用户程序中出现难以追踪的错误。

标签: java arrays generics hash declaration


【解决方案1】:

简答:你不能

ObjectsupertypeHashObject 的一个supertype,而不是子类型,因此无论您做什么,都不能将实例化为Object 的对象添加到声明为HashObject 的数组中。如果你仔细想想,Object 真的可以是任何东西,你可能会尝试将Integer 添加到HashObject 数组中,这显然是行不通的。不过,你可以做相反的事情。您可以将数组声明为Object 数组,并添加HashObject 的实例。

【讨论】:

    【解决方案2】:

    这里有几个问题...

    private HashObject<G>[] table = (HashObject<G>) new Object[95957];
    

    首先,您应该转换为 (HashObject&lt;G&gt;[]) 而不是 (HashObject&lt;G&gt;)。其次,由于数组类型是invariant,因此无法转换这样的数组。但是,您可以执行以下操作...

    @SuppressWarnings("unchecked")
    private HashObject<G>[] table = new HashObject[95957];
    

    实例化数组很好,因为 HashObject 本身不是通用的,HashObject[]HashObject&lt;G&gt;[] 之间的转换也有效,因为在运行时 HashObject&lt;G&gt;[] 被擦除为 HashObject[],即它们成为相同的类型.

    【讨论】:

      【解决方案3】:

      您将遇到类转换异常,因为无法将 Object 数组转换为 HashObject 数组,就像您无法获取 Object 实例并将其转换为自定义类一样。

      要创建一个 HashObject 数组,请使用 new HashObject[size]。使用泛型:

      HashObject<G>[] table = (HashObject<G>[]) new HashObject<?>[95957];
      

      【讨论】:

        猜你喜欢
        • 2011-03-01
        • 2019-04-08
        • 2019-11-16
        • 2016-10-02
        • 1970-01-01
        • 2010-12-04
        • 2011-04-20
        • 2021-02-01
        • 2012-09-17
        相关资源
        最近更新 更多