首页 > 解决方案 > Java(SE8)中不允许的通用类型数组如何工作?

问题描述

我试图实现一个 R-way Trie 符号表,但与此同时,我遇到了一个不寻常的问题,或者我无法解决这个问题。让我解释一下我面临的问题:

package edu.nraj.dsalgo.rwaytrie;

public class RWayTrieST<Value> {
    private static final int R = 256; 
    private Node root = new Node();

    private class Node{
        private Object value;
        private Node[] next = new Node[R];
    }

    public static void main(String[] args) {

    }

}

在这个代码块中可以清楚地看到我正在创建一个内部私有类

private class Node{ ... }

但是现在 java se8 编译器显示了一个问题

private Node[] next = new Node[R];

arrays of generic types not allowed. Node我已经碰巧知道Java不允许泛型类型数组。

泛型数组问题提示截图

但是,如果我将Private Node class其设为静态类,编译器将停止抛出错误。

package edu.nraj.dsalgo.rwaytrie;

public class RWayTrieST<Value> {
    private static final int R = 256; 
    private Node root = new Node();

    private static class Node{
        private Object value;
        private Node[] next = new Node[R];
    }

    public static void main(String[] args) {

    }

}

将静态添加到节点类屏幕截图后没有问题

有人可以解释这种行为的根本原因,这样我就可以解决这个问题。

标签: java

解决方案


用最简单的方式来说,当你使一个类泛型时,它的所有内部类也是泛型的,因为它们共享外部类信息。您可能已经知道,两者之间的区别

public class RWayTrieST<Value> {
    private class Node {}
}

public class RWayTrieST<Value> {
    private static class Node {}
}

是,在前者中, Node 是一个内部类,并且 的实例Node必须与RWayTrieST. 所以如果你有foo = New RWayTrieST<String>()并且你有bar = foo.new Node(),那么对于编译器来说,bar的类型是有效RWayTrieST<String>.Node的,因为外部类的通用信息是必要的。

然而,在后者中,实例Node不绑定到实例,RWayTrieST因为它是一个静态内部类。所以Node不共享外部类通用信息,这意味着它不是通用的。


推荐阅读