java - Java (SE8) 中不允许的通用类型数组如何工作?

标签 java

我试图实现一个 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)类

private class Node{ ... }

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

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

泛型数组是不允许的。 Node 我已经碰巧知道 Java 不允许使用泛型类型数组。

The generic type array issue hint screenshot

但是,如果我将此 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) {

    }

}

No issue after adding static to Node class screenshot

谁能解释一下这种行为的根本原因,这样我就可以全神贯注了。

最佳答案

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

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

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

是,在前者中,Node 是内部类和 Node 的实例必须绑定(bind)到 RWayTrieST 的实例.所以如果你有 foo = New RWayTrieST<String>()你有bar = foo.new Node() ,然后到编译器,bar的类型实际上是 RWayTrieST<String>.Node因为外部类的通用信息是必需的。

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

关于java - Java (SE8) 中不允许的通用类型数组如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53680912/

相关文章:

java - 是否可以从 cucumber-jvm 迁移到 QAF?

java - 如何从 ListView 获取变量并传递给另一个 Activity ?

java - 如何使用java代码从web服务读取数据并在聊天机器人中打印

java - 在 tomcat 中部署模型项目的最佳方法是什么

java - 在同一个类中实现 Java Iterator 和 Iterable?

java - 使用循环显示特定的 arraylist 对象

Java登录代码从文件中读取多行不起作用

java - 为什么我的值没有在 Android Studio 中使用 startActivityForResult() 在 Activity 之间传递?

java - Android 错误/点击崩溃

java - java.util.concurrent.CompletableFuture#allOf 的目的是什么?