使用外部类的参数化类型的 Java 内部类



我在Java中创建了一个内部类,该类使用外部类的参数化类型作为实例字段。现在,当我尝试为这个内部类创建一个数组时,我得到了classcast异常

 class ModdedSeperateChainingAlternate<Key, Value> extends SeperateChainingHashST<Key, Value> {
    int N;
    int M;
    Node[] list = (Node[]) new Object[M]; //  classcast exception
    class Node {
        Node next;
        Key key;
        Value value;
        int n;
        public Node(Key k, Value v, Node next) {
            this.key = k;
            this.value = v;
            this.next = next;
        }
        ......
    }

请给我建议如何避开这个问题。Im是一个泛型noob

您正在将Object[]强制转换为Node[]:

Node[] list = (Node[]) new Object[M]; //  classcast exception

简单的解决方案是只创建一个Node[]

Node[] list = new Node[M];

然而,由于这里解释的原因,这失败了:

无法创建TWTestCase.ModdedSeperateChainingAlternate.Node 的通用数组

因此,为了实现您的目标,您需要使用一些Collection,最好是List:

List<Node> list = new ArrayList<Node>(M);

当你在做它的时候,根据Java标准,实例变量应该是骆驼式的:

int m;

此外,int m将具有默认整数值,即0。换句话说,您将创建一个零长度的数组。确保变量已初始化(例如int i = 5)。

至于泛型部分,NodeModdedSeperateChainingAlternate<Key, Value>派生出它的类型。你可以在这里阅读更多关于泛型的内容。

Node是一个非静态嵌套类。这意味着它在外部类的类型参数的范围内,并且被该类型参数有效地"参数化",即使它不直接在Node上。

当您在ModdedSeperateChainingAlternate中编写一个空的Node时,它隐含地表示ModdedSeperateChainingAlternate<Key, Value>.Node,这是一个参数化类型。您不能创建参数化类型的数组,例如,您不能执行new ArrayList<String>[M];出于同样的原因,您不能执行new Node[M](相当于new ModdedSeperateChainingAlternate<Key, Value>.Node[M])。

相反,您可以执行以下任一操作:

  • 创建一个原始类型的数组,如new ArrayList[M]。但是在这种情况下,如何编写原始类型呢?它不是我们所看到的Node。相反,您必须用原始外部类型明确地限定它:

    Node[] list = new ModdedSeperateChainingAlternate.Node[M];
    
  • 或者,创建一个使用所有通配符参数化的类型的数组,如new ArrayList<?>[M]。在这种情况下,它将是:

    Node[] list = (Node[])new ModdedSeperateChainingAlternate<?, ?>.Node[M];
    

最新更新