[英]JAVA Type Parameter in Linked List
Java 类型参数声明作为内部 class 的一部分。
我的问题在链表上。 我在ArrayList
实现中看到了同样的情况。
public class LinkedList<E> implements Iterable<E> {....
private class LinkedIterator implements Iterator<E>{...} //inner class of LinkedList
private static class ListNode<E> //implemented as nested static class
Question: Why does the iterator (and constructor for LinkedList) both do not require type parameter, I think listNode requires because static class make it can not access class header of the outter class.
任何 class 定义是:
static
是一个内部 class。 从概念上讲,class 仅存在于外部 class 的单个实例中。 实际上,这意味着:
外部类型有一个隐藏的、私有的和最终的字段。 所有的构造函数都需要一个外部实例,但是 java 语法是特殊的: outerRef.new Inner();
- 如果您处于Outer.this
合理的上下文中,则这是默认值。 该字段没有吸气剂。
外部 class 的所有类型参数在内部 class 中也可用,除非有阴影。
因此,鉴于private class LinkedIterator
在class LinkedList
内部,它就是这种内部 class,它具有隐藏字段<E>
来自LinkedList<E>
。 然而,节点是static
,因此它没有该字段并且不继承<E>
- 而是选择自己声明它。
请注意,内部类既复杂又令人惊讶。 例如,它们可能会弄乱垃圾收集(因为它们持有对其外部的引用;例如,这将阻止外部的 gc)。 作为一般规则,如果您不确定,强烈推荐 static 内部类,使外部实例或其 generics 的任何 inheritance 显式。
换句话说:
public class Outer<E> {
public class Inner {}
}
很棘手; 不要这样做,除非您确定内部 class 的概念完全适用。 如果您不知道这意味着什么或不确定,请改写为:
public class Outer<E> {
public static class Inner<E> {
private final Outer<E> context;
public Inner(Outer<E> context) {
this.context = context;
}
}
}
当然,省略所有不需要的部分。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.