【发布时间】:2016-08-19 23:02:00
【问题描述】:
我正在尝试在 Java 中实现一个基本的哈希图,但我一直在纠结为什么我不能声明我的自定义类 KVPair 的数组。在多次尝试修复我的构造函数中的数组声明后,我得到一个错误:
contains = new KVPair[capacity];
当我尝试这个时,我收到一个编译错误,提示我“无法创建 HashMap.KVPair 的通用数组。”
我还从另一个 stackexchange 答案中看到,该答案建议将对象数组转换为类似这样的其他东西:
contains = (KVPair[])new Object[capacity];
执行此操作时,我收到运行时错误消息“java.lang.ClassCastException: [Ljava.lang.Object; 无法转换为 [MyHashMap$KVPair;。”
下面我包含了我的 hashmap 类的构造函数之一以及我的 KVPair 类。任何有关如何解决此问题的帮助将不胜感激。
public class MyHashMap<K, V> implements Iterable<K> {
private static final int DEFAULT_CAPACITY = 200;
private static final double DEFAULT_LOAD_FACTOR = 0.7;
private int capacity; // the number of buckets in the map
private int size; // the number of items that have been put into the map
private double loadFactor;
KVPair[] contains;
// Constructs an empty map.
public MyHashMap() {
capacity = DEFAULT_CAPACITY;
this.loadFactor = DEFAULT_LOAD_FACTOR;
contains = (KVPair[]) new Object[capacity];
}
...
public class KVPair {
private K key;
private V value;
private KVPair next;
private int hash;
private KVPair(Object k, Object v){
key = (K) k;
value = (V) v;
next = null;
hash = k.hashCode();
}
public KVPair(Object k, Object v, KVPair nextKV){
key = (K) k;
value = (V) v;
next = nextKV;
hash = k.hashCode();
}
}
【问题讨论】:
-
好吧,你的语法错误,你使用的是原始类型进行转换。然而,仅凭这一点并不能解决问题。 Java 的泛型是不可重构的,并且运行时实际上无法验证转换。你必须使用
@SupressWarnings:stackoverflow.com/questions/1129795/… -
@markspace 在编译时没有任何东西会导致强制转换异常。这与语法无关
-
@markspace 你是什么意思我的语法错误?我还应该如何将我的 Object 数组转换为 KVPair 数组?
-
你为什么将
k和v作为KVPair的构造函数传递给Objects,然后再进行转换?为了类型安全,为什么不首先将它们设为K和V?
标签: java arrays generics classcastexception