我正在尝试创建一个嵌套类Key
的数组,它使用主类BTree
中的类型变量/参数,但我无法摆脱运行时的ClassCastException
。我不太擅长 Java 中的泛型,如果有人让我知道问题是什么以及如何解决它,我将不胜感激。
public class BTree<T extends Comparable<T>, V> {
//...
private class Node {
public int n;
public boolean isLeaf = false;
public Key[] keys = (Key[]) new Comparable[2 * MIN_DEGREE - 1]; //ClassCastException
public Node[] children = (Node[]) new Object[2 * MIN_DEGREE];
}
private class Key implements Comparable<Key> {
public T key;
public V val;
public Key(T key, V val) {
this.key = key;
this.val = val;
}
public boolean lessThan(Key that) {
return this.key.compareTo(that.key) < 0;
}
public boolean greaterThan(Key that) {
return this.key.compareTo(that.key) > 0;
}
@Override
public int compareTo(Key that) {
if (this.lessThan(that)) return -1;
if (this.greaterThan(that)) return 1;
return 0;
}
}
//....
}
编辑:
我还尝试将 Object
数组转换为 Key
数组,它也会抛出 ClassCastException
:
public Key[] keys = (Key[]) new Object[2 * MIN_DEGREE - 1];
当我创建 Key
数组而不进行强制转换时,它会在编译时出现通用数组创建
错误:
public Key[] keys = new Key[2 * MIN_DEGREE - 1];
最佳答案
And when I create
Key
array without casting it givesGeneric array creation
error when compiling:public Key[] keys = new Key[2 * MIN_DEGREE - 1];
这样做的原因是Key
是泛型类中的内部类 BTree<T, V>
,所以当你写 Key
时本身在里面BTree
,它隐式意味着 BTree<T, V>.Key
,这是一个参数化类型,不允许创建参数化类型的数组。
当人们想要创建参数化类型的数组时,一种解决方案是创建原始类型的数组,然后将其转换为“参数化类型的数组”类型。这里棘手的问题是如何编写原始类型。它不是Key
本身,因为它是参数化类型(因为它由参数化外部类型隐式限定)。相反,您必须使用原始外部类型显式限定它,以便编写内部类的原始类型:
public Key[] keys = (Key[])new BTree.Key[2 * MIN_DEGREE - 1];
关于java - 尝试使用类型变量创建类的数组时出现 ClassCastException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56100575/