我有两个与以下代码相关的问题(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;
}
Node<Item>
和Node之间的区别是什么?这两种实现都是通用的,那么Node和Node<Item>
在这里有何区别?谢谢!
答案 0 :(得分:3)
如果您的嵌套类不是static
,那么它就是一个内部类,并且封闭类的类型参数Item
在范围内。但是,如果嵌套类为static
,则封闭类的类型参数在范围内不,因为该类型参数与封闭类的实例有关,这与static
嵌套类无关。
此处,static
类Node
声明了自己的Item
类型参数。它本可以声明任何其他名称,它本来是等价的。在第二种情况下(使用Node<Item>
类),您不应该使用static
收到编译器错误;这是合法的。
答案 1 :(得分:3)
- 这里
醇>Node<Item>
和Node
之间的区别是什么?
添加泛型参数是必要的,因为Java禁止static
泛型类的内部类引用其外部类型的类型参数。
- 第二个版本中
醇>static
的含义是什么?
static
表示Node
个实例不会获得对其父类的引用,并且可以在必要时在其上下文之外创建。它并不完全是关键的#34;,但是将节点缩小了三分之一(两个引用与三个引用),这是一个优势。
答案 2 :(得分:2)
如果嵌套类不静态(称为内部类),则意味着每个实例都属于封闭类的实例。因此,在第一个示例中,Node
实例属于LinkedBag<Item>
,因此它已具有泛型Item
(来自LinkedBag<Item>
)。
静态嵌套类的实例不属于封闭类型的实例,因此它不会从封闭实例中获取泛型类型参数 - 您需要为其提供自己的通用类型参数参数。
查看标准Java集合框架中各种Collection
和Map
实现的源代码,您可以看到Node
类的两种方法(静态和非静态)常用。