【发布时间】:2020-02-18 03:58:26
【问题描述】:
我有一个任务,目标是创建一个具有通用键和值的 HashTable 实现。为了处理冲突,我们被告知要使用单独的链接。所以,我尝试这样做:
public class HashTable<K, V> implements Table<K, V> {
private Node[] generics;
public class Node {
V value;
Node next;
public Node(V val) {
value = val;
}
}
public HashTable(int size) {
generics = (Node[]) new Object[size];
}
}
对于单独的链接,我想使用链表实现(还有什么),这就是为什么我需要generics 来保存Node,而不仅仅是V。我不能只写generics = new Node[size]; 的原因是 Node 类包含一个泛型,并且不允许创建泛型数组。对于这个分配,这个产生“未经检查的强制转换”警告的解决方法是可以接受的。
然后,在驱动程序中,它尝试Table<String, String> ht = new HashTable<String, String>(5); 并获得 ClassCastException。当generics 是V[] 时,没有ClassCastException,用于上下文。
所以,我的问题是:如何创建自定义类数组,其中自定义类包含泛型(不更改驱动程序)?
【问题讨论】:
-
只需将
generics设为Object数组,然后在您的get 方法中将各个值转换为Node。但是您知道Node的数组不是链表,对吧?它仍然是一个数组。 -
@MattD 是的,它是
Node的数组。每一个都是链表的头部。 -
@MattD 我尝试了您的建议,并且有效。但是,它会在尝试从
Object转换为Node时创建一个“未经检查的转换”警告,并且我们被允许的唯一编译警告来自泛型数组创建(尽管Node本身不是泛型的)。感谢你的回答!这个解决方案似乎仍然是不好的做法,但它确实有效,并且某种未经检查的强制转换似乎是不可避免的。
标签: java arrays generics classcastexception