java如何创建用于哈希表的通用对象数组?
因此,我有三个类HashTest,HashTable,和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
# 1 楼答案
您将获得一个类强制转换异常,因为对象数组不能强制转换为HashObject数组,就像您不能获取对象实例并将其强制转换为自定义类一样
要创建HashObject的数组,请使用
new HashObject[size]
。对于泛型:# 2 楼答案
这里没有什么问题
首先,你应该选择
(HashObject<G>[])
而不是(HashObject<G>)
。其次,这样转换数组不起作用,因为数组类型是invariant。然而,你能做的是实例化数组很好,因为
HashObject
本身不是泛型的,而且HashObject[]
和HashObject<G>[]
之间的转换也可以工作,因为在运行时HashObject<G>[]
被擦除为HashObject[]
,即它们成为相同的类型