java - 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) {
}
}
有人可以解释这种行为的根本原因,这样我就可以解决这个问题。
解决方案
用最简单的方式来说,当你使一个类泛型时,它的所有内部类也是泛型的,因为它们共享外部类信息。您可能已经知道,两者之间的区别
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
不共享外部类通用信息,这意味着它不是通用的。
推荐阅读
- c - 不兼容的指针类型将'void(void *)传递给'void *类型的参数
- node.js - vue-cli 中的图像导致问题。Node-Express,mysql后端
- r - 在 kableExtra() 中格式化标题
- r - 在 R 中获取 Vine Copula(三变量)的 CDF
- ios - Xcode11 中的较低部署目标
- mysql - 我怎样才能得到项目的总数?
- javascript - Mutations-Observer 获得添加元素
- r - 将嵌套列表的第二个元素设置为列表元素的名称 (purrr)
- postgresql - 如何从 Postgres 转储中 pg_restore 一个表及其模式?
- node.js - 如何使用 xPath 在 Puppeteer 中单击元素