有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何创建用于哈希表的通用对象数组?

因此,我有三个类HashTestHashTable,和HashObject。HashTest的目的是使用三种不同的输入源测试哈希表:整数、长数和字符串

根据指定的源,我将创建一个哈希表<;整数|长|字符串>;对象,然后开始插入元素

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

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的参数是<;HashObject<;整数|长|字符串>>;,然后我在哈希表中声明一个G[]数组,并在初始化时转换为G[]:

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

这消除了我的ClassCastException,然而,在我的代码中,我不再能够使用HashObject方法,因为对于“待定”数据类型G,这些方法不存在

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

上述方法行不通,因为incrementDuplicates()方法“对于类型G是未定义的”

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


共 (2) 个答案

  1. # 1 楼答案

    您将获得一个类强制转换异常,因为对象数组不能强制转换为HashObject数组,就像您不能获取对象实例并将其强制转换为自定义类一样

    要创建HashObject的数组,请使用new HashObject[size]。对于泛型:

    HashObject<G>[] table = (HashObject<G>[]) new HashObject<?>[95957];
    
  2. # 2 楼答案

    这里没有什么问题

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

    首先,你应该选择(HashObject<G>[])而不是(HashObject<G>)。其次,这样转换数组不起作用,因为数组类型是invariant。然而,你能做的是

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

    实例化数组很好,因为HashObject本身不是泛型的,而且HashObject[]HashObject<G>[]之间的转换也可以工作,因为在运行时HashObject<G>[]被擦除为HashObject[],即它们成为相同的类型