【发布时间】:2020-11-23 04:23:41
【问题描述】:
所以,我有三个类 HashTest、HashTable 和 HashObject。 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的参数是
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