繁体   English   中英

链表中的 JAVA 类型参数

[英]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 定义是:

  • 在另一个 class 定义中。
  • 标记static

是一个内部 class。 从概念上讲,class 仅存在于外部 class 的单个实例中。 实际上,这意味着:

  • 外部类型有一个隐藏的、私有的和最终的字段。 所有的构造函数都需要一个外部实例,但是 java 语法是特殊的: outerRef.new Inner(); - 如果您处于Outer.this合理的上下文中,则这是默认值。 该字段没有吸气剂。

  • 外部 class 的所有类型参数在内部 class 中也可用,除非有阴影。

因此,鉴于private class LinkedIteratorclass 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM