Java “理解”;格式不正确的类型,原始类型上给出的类型参数;在外部类之外使用类型化内部类时

Java “理解”;格式不正确的类型,原始类型上给出的类型参数;在外部类之外使用类型化内部类时,java,generics,nested-generics,Java,Generics,Nested Generics,我对以下内容感到有点困惑,非常感谢您的帮助 我想做的是实现一个通用的循环列表,在这里我可以从外部访问节点(而不是它们的值)。我将尝试给出一个说明这一点的最小设置 class CircularList<T>{ Node<T> first; /*Implementation details..., getters, setters */ public Node<T> getFirst(){ return this.first };

我对以下内容感到有点困惑,非常感谢您的帮助

我想做的是实现一个通用的循环列表,在这里我可以从外部访问节点(而不是它们的值)。我将尝试给出一个说明这一点的最小设置

class CircularList<T>{
    Node<T> first;
    /*Implementation details..., getters, setters */
    public Node<T> getFirst(){ return this.first };

    public class Node<U>{
        /*...*/
    }
}
类循环列表{
节点优先;
/*实现细节…,getter,setter*/
公共节点getFirst(){返回this.first};
公共类节点{
/*...*/
}
}
在另一类中的用法:

CircularList<Vertex> vertices = new CircularList<>();
/*...*/
Node<Vertex> vertex = vertices.getFirst();
CircularList顶点=新的CircularList();
/*...*/
节点顶点=顶点。getFirst();
在最后一行,它说的是一个原始类型的类型参数,我真的不明白。我不明白这怎么会是原始类型。我仔细考虑了CircularList的类型参数和getFirst返回的事实 一个类型不是raw的节点,但我显然弄错了

这里:

public class Node<U>{
公共类节点{
应该说
Node

类中已经有了泛型类型
T
;显然,Ts的循环列表应该只包含T的节点

基本上,您引入了另一个第二种类型的参数。这只会增加“混乱”。还要注意,您的内部节点类不是静态的,因此没有什么可以阻止您说节点的实例在t中是泛型的,就像封闭的列表类一样


您的代码毫无理由地添加了第二个通用参数。

您没有为循环列表指定参数:

CircularList<Vertex>.Node<Vertex> vertex = vertices.getFirst();
CircularList.Node vertex=顶点.getFirst();
更新


但这没有多大意义:您应该将类
节点声明为静态,或者不为其指定任何参数(并使用封闭类的参数t)。

如果它不是静态类,它会自动使用其封闭类的类型参数。您可以使用
节点声明{
隐藏外部泛型类型参数。而只隐藏
节点{
必须使用;类型参数
T
仍将在内部类中可用。使用T作为内部类型参数是我第一次做的,这就是为什么我将其更改为U,以更精确地表示它不一定是外部类型,而只是阴影。Odly,将内部类改为static消除了错误,但正如我所理解的这就引入了在没有我不想要的对应列表的情况下实例化节点的可能性。对此有什么建议吗?删除内部类型参数并不会改变错误:/Ok,我认为这会解决问题,但我同意这有点难看。我将尝试重构它。据我所知,在列表之外使用类型化节点是没有办法的f我不喜欢静态版本,因为如果我从内部类的签名中完整地删除类型参数,我将无法使用它?很高兴你得到了完整的答案。这仍然是一个有趣的问题!谢谢!老实说,我对它的“外观”不满意最后,我觉得语言应该让这样的事情变得更简单,但从你们两个的答案中,我想我开始明白,由于必须进行隐含的推理,通过阅读代码,它会导致无法理解的结构。我觉得奇怪的是,剩下的选项我的观点是:使内部类保持静态或使用业务代码使其丑陋。这两个选项都让我感觉不好,可能我的设计就是不好。。。