Java—为什么静态在这种情况下很重要

Java—为什么静态在这种情况下很重要,java,generics,static,Java,Generics,Static,我有两个问题与以下代码(链接包)有关: 公共类LinkedBag实现了Iterable{ private Node first;//包的开头 private int N;//包中的元素数 私有类节点{ 私人物品; 私有节点下一步; } 这个呢 public class Bag<Item> implements Iterable<Item> { private Node<Item> first; // beginning of bag private i

我有两个问题与以下代码(链接包)有关:

公共类LinkedBag实现了Iterable{
private Node first;//包的开头
private int N;//包中的元素数
私有类节点{
私人物品;
私有节点下一步;
}
这个呢

public class Bag<Item> implements Iterable<Item> {
private Node<Item> first;    // beginning of bag
private int N;               // number of elements in bag

// helper linked list class
private static class Node<Item> {
    private Item item;
    private Node<Item> next;
}
public类包实现Iterable{
private Node first;//包的开头
private int N;//包中的元素数
//助手链表类
私有静态类节点{
私人物品;
私有节点下一步;
}
  • Node
    和Node在这里有什么区别?这两种实现都是通用的,那么Node和
    Node
    在这里有什么区别呢
  • 在第二个版本中,静态的含义是什么,为什么它很重要?(没有静态就不能编译)

  • 谢谢!

    如果您的嵌套类不是
    静态的
    ,那么它是一个内部类,并且封闭类的类型参数
    在范围内。但是,如果您的嵌套类是
    静态的
    ,那么封闭类的类型参数不在范围内,因为该类型参数与封闭类的实例有关g类,与
    静态
    嵌套类无关

    在这里,
    static
    class
    Node
    声明了它自己的
    Item
    类型参数。它可以声明任何其他名称,并且是等效的。在第二种情况下(使用
    static
    类),您不应该收到使用
    Node
    的编译器错误;这是合法的。

    如果嵌套类不是静态的(称为内部类),这意味着每个实例都属于封闭类的实例。因此,在第一个示例中,
    节点
    实例属于
    链接数据库
    ,因此它已经有一个泛型
    (来自
    链接数据库

    静态嵌套类的实例不属于封闭类型的实例,因此它不会从封闭实例获取泛型类型参数-您需要为其提供自己的泛型参数

    查看标准Java集合框架中各种
    集合
    映射
    实现的源代码,您可以看到
    节点
    类的两种方法(静态和非静态)都是常用的

  • 这里的
    Node
    Node
    有什么区别
  • 添加泛型参数是必要的,因为Java禁止泛型类型的内部类引用其外部类型的类型参数

  • 第二个版本中的
    static
    是什么意思

  • 静态
    意味着
    节点
    实例不获取对其父类的引用,如果有必要,可以在其上下文之外创建。这并不完全是“关键”,但会将节点缩小三分之一(两个引用与三个引用),这是一个优势。

    我很确定,这只是意味着,静态的一个,就是它在您创建的所有类实例中都是相同的
    这里节点和节点之间的区别是什么?两种实现都是通用的
    ,不知道您指的是什么,第一个定义不是通用的。您能澄清一下您的想法吗指第一个point@Ramanlfc,是的,我注意到并修复了这个问题。很多很好的答案,谢谢大家!!肯定是对你们所有答案的支持:)谢谢!很好的答案!@Niminim没问题。我很高兴我能帮上忙。真的很好的答案!现在我明白了在这种情况下使用静态的优势。没有静态,它不会编译,这就是为什么它是c这里是rucial。回答得很好!谢谢!很高兴知道我可以在Node中使用任何其他名称,并且它应该是等效的。
    
    public class Bag<Item> implements Iterable<Item> {
    private Node<Item> first;    // beginning of bag
    private int N;               // number of elements in bag
    
    // helper linked list class
    private static class Node<Item> {
        private Item item;
        private Node<Item> next;
    }