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

标签 java arrays generics

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

相关文章:

java - 使用 Java nio 写入文件元数据的问题

php - 部分提取 php 代码的正则表达式((数组定义))

c# - 为什么 char 数组在控制台上显示内容,而 string 和 int 数组不在 c# 中?

asp.net - 为什么我的 WCF 服务返回和 ARRAY 而不是 List <T>?

java - wildcare 泛型参数与无泛型参数之间的区别

java - 来自 bash 命令行的 Java Heredoc

java - Android MediaCodec 如何创建解码器?

c# - 在 C# 中,如何使用泛型的基类将泛型接口(interface)的所有实例注入(inject)到单个构造函数中?

java - 如何在 Spring MVC 中调用 Controller 方法

c++ - 初始化私有(private)成员静态常量数组