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

时间:2016-03-17 19:05:29

标签: java generics static

我有两个与以下代码相关的问题(Linked Bag):

public class LinkedBag<Item> implements Iterable<Item> {

private Node first;    // beginning of bag
private int N;         // number of elements in bag

private class Node {
    private Item item;
    private Node next;
}

和这一个

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;
}
  1. Node<Item>和Node之间的区别是什么?这两种实现都是通用的,那么Node和Node<Item>在这里有何区别?
  2. 第二个版本中静态的含义是什么,为什么它至关重要? (没有静态编译)。
  3. 谢谢!

3 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:3)

  
      
  1. 这里Node<Item>Node之间的区别是什么?
  2.   

添加泛型参数是必要的,因为Java禁止static泛型类的内部类引用其外部类型的类型参数。

  
      
  1. 第二个版本中static的含义是什么?
  2.   

static表示Node个实例不会获得对其父类的引用,并且可以在必要时在其上下文之外创建。它并不完全是关键的#34;,但是将节点缩小了三分之一(两个引用与三个引用),这是一个优势。

答案 2 :(得分:2)

如果嵌套类静态(称为内部类),则意味着每个实例都属于封闭类的实例。因此,在第一个示例中,Node实例属于LinkedBag<Item>,因此它已具有泛型Item(来自LinkedBag<Item>)。

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

查看标准Java集合框架中各种CollectionMap实现的源代码,您可以看到Node类的两种方法(静态和非静态)常用。