• [转]《Java Generics and Collections》读书笔记四:构造函数,静态成员,嵌套类


    转自:http://www.diybl.com/course/3_program/java/javaxl/20071220/92737.html

    参考资料:《Java Generics and Collections》
     
    1. 构造函数
    这个没什么好说的,在一个泛型类中,类型参数在类声明的头部声明的,也就是接着class ClassName <T, U>。在定义构造函数时,不需要带上类型参数,函数体中就可以引用类型参数。不过在使用new创建对象时,需要在类名后面带上类型参数,否则将会导致一个未检查(Unchecked)的异常信息。
    2. 静态成员
    静态成员最重要的一个特点,就是整个类都共享它。由于Java泛型采用擦除法实现,也就是说一个泛型类,不管任何类型参数,在运行时都拥有相同的class类型,像List<Integer>,List<String>和List<List<Strng>>在运行时的类型都是List。因此,拥有不同类型参数的泛型类,也都共享相同的静态成员。这样一来,静态成员,无论是静态实例域,还是静态方法,都不允许引用该类的类型参数。在调用静态方法,或使用静态变量时,也只能使用ClassName.method()这样的形式,不能带有任何的类型参数。
    当然了,静态方法可以声明为泛型方法,就像Collections.addAll()等方法一样,只要不是引用类本身声明的类型参数就可以。
    3. 嵌套类
    Java允许一个类嵌套定义在另一个类里面,有内部类,静态内部类以及匿名内部类等多种形式。一般来说,使用比较广泛而且比较有用的就是静态内部类,另外匿名内部类也很方便。与静态成员的规则类似,静态内部类不能引用外部类的类型参数,内部类以及匿名内部类则可以正常引用,其中匿名内部类由于语法的原因,将不能声明自己的类型参数。
    public class LinkedCollection<E> extends AbstractCollection<E> {
     private class Node {
        private E element;
        private Node next = null;
        private Node(E elt) { element = elt; }
     }
     private Node first = new Node(null);
     private Node last = first;
    }
    class LinkedCollection<E> extends AbstractCollection<E> {
     private static class Node<T> {
        private T element;
        private Node<T> next = null;
        private Node(T elt) { element = elt; }
     }
     private Node<E> first = new Node<E>(null);
     private Node<E> last = first;
    }
    上面代码演示了在泛型类中使用内部类,静态内部类的不同之处。内部类可以引用外部类的类型参数,所以不需要声明为泛型类了;而静态内部类由于无法引用,只能声明为泛型类,并在创建对象的时候把类型参数传进来。推荐使用后一种,因为静态内部类一般来说会更加简单,也更加高效。

  • 相关阅读:
    hdu 1863 畅通工程(Kruskal+并查集)
    1.1.2最小生成树(Kruskal和Prim算法)
    1.1.1最短路(Floyd、Dijstra、BellmanFord)
    ACM复习专项
    装饰器和偏函数
    Python函数基础
    (六)面向对象高级编程
    Zabbix漏洞利用 CVE-2016-10134
    Struts-S2-045漏洞利用
    F5 BIG-IP 远程代码执行漏洞环境搭建
  • 原文地址:https://www.cnblogs.com/apigiraffe/p/2685120.html
Copyright © 2020-2023  润新知