泛型

一、泛型

      定义:在jdk1.5版本以上,java为了解决集合中不同对象类型带来的安全隐患, 而产生的类型安全机制。

               使用方法:

        在创建集合的时候,在集合类型后面加上尖括号<>,括号中写上集合中准备传入的对象(元素)类型,
      for example: ArrayList<String> al = new ArrayList<String>();
             LinkedList<String> ll = new LinkedList<String>();
               HashSet<String> hs = new HashSet<String>();
               TreeSet<String> ts = new TreeSet<String>(new Comparator());
              (TreeSet中,自定义比较器在接口声明后面也可以加<>来传入类型参数
                class MyComparator inplements Comparator<String> )

        同时在获取迭代器的时候,也应当在叠加器后加上尖括号<>,括号中声明与对应集合中相同的对象(元素)类型。
        for example: ListIterator<String> li = al.listIterator();
                ListIterator<String> li = ll.listIterator();
                Iterator<String> it = hs.iterator();
                Iterator<String> it = ts.Iterator();

        在集合框架中,泛型比较常见,只要见到了<>就应当定义泛型, 其实<>及时用来接收类型的。
        在使用集合的时候,将集合中要存储的引用数据类型作为参数传递到<>中即可。

        好处1、将运行时期产生的ClassCastException,转移到了编译时期,使得程序员解决问题,让运行时期问题减少,安全。
        好处2、避免了强制转换的麻烦。


二、自定义泛型类。

      在我们自定义的类中,当类中要操作的引用数据类型不确定时,为了提高程序的扩展性,而进行的步骤。
      在jdk1.5之前,我们使用Object类来提高程序的扩展性、
      而现在,我们可以使用 泛型类 来提高程序的扩展性。

          就是在定义的类名后面加<>,而括号中声明泛型。
    for example: class Tool<T>
          {
            private T t;
            public void setT(T t)
            {
                this.t = t;
            }
          }
      在实例化该类对象时,在类名后面T处,指定该对象要操作的方法。

      Tool<String> t = new Tool<String>();


三、自定义泛型方法。

      泛型类定义的泛型,在整个类中有效,如果这个类型要被方法使用,那么泛型类的对象明确要操作的具体类型后,所有的要操作类型都已经固定了。
    未了让不同方法可以操作不同类型,而且类型还不确定,那么可以将泛类型定义到方法上。定义位置呢在返回值前面

      如: public <T> void show(T t){} : 之后能传入所有引用类型。

    注: 静态方法不能访问类上定义的泛型, 如果静态方法操作的引用类型不确定,那么可以将泛型定义在方法上。

    如: public static <T> void method(T t){} :之后能传入操作所有引用类型。




四、自定义泛型接口。

    与泛型类相似, 例子: interface Inter <T> { void method(T t); }
    其实现类,可以传入类型参数: class IntIple implements Inter<String> {public void method(String str){}}
         也可以不传入参数: class IntIple<T> implements Inter<T> {public void method(T t){} }


五、泛型类的高级应用。

    通配符: <?>,也可以理解为占位符,表示在此处应当传入的引用参数类型不确定。

      泛型的限定:<? extends T> :表示该处可以传入类型T,或者T的子类型: 上限限定
            <? super T> :表示该处可以传入类型T,或者T的父类型: 下限限定

原文地址:https://www.cnblogs.com/soficircle/p/6671142.html