gpt4 book ai didi

java - 尝试使用类型变量创建类的数组时出现 ClassCastException

转载 作者:行者123 更新时间:2023-12-02 09:54:31 25 4
gpt4 key购买 nike

我正在尝试创建一个嵌套类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 gives Generic 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com