• JDK 1.5 新特性——泛型


      Java中的泛型(Generics)跟C++中的模版大同小异,都是为了简化代码,为变成提供了方便!

    1.类型安全

         泛型的主要目标是提高Java 程序的类型安全。通过知道使用泛型定义的变量的类型限制,编译器可以在一个高得多的程度

    上验证类型假设。没有泛型,这些假设就只存在于程序员的头脑中。

    2.消除强制类型转换

    泛型的一个附带好处是,消除源代码中的许多强制类型转换。这使得代码更加可读,并且减少了出错机会。

    3.潜在的性能收益

        泛型为较大的优化带来可能。在泛型的初始实现中,编译器将强制类型转换(没有泛型的话,程序员会指定这些强制类型

    转换)插入生成的字节码中。但是更多类型 信息可用于编译器这一事实,为未来版本的JVM 的优化带来可能.

    JDK5以前的List操作:

         类List的函数add接受一个Object参数:

    1 public boolean add(java.lang.Object element);//存入的是Object对象,不能确定对象类型

        类List的函数get函数从中取出一个对象:

    1 public java.lang.Object get(int index) throws IndexOutOfBoundsException//取出的也是Object对象,需要强制类型转换

    一般编码示例:

    1 List stringList1 = new ArrayList();
    2 stringList1.add("Java 5");
    3 stringList1.add("with generics");
    4 String s1 = (String) stringList1.get(0);

      如果我们能限制装入对象的数据类型,使其保持一致,就能很好的解决这个问题,这样取数据的时候将不要数据类

    型的强制转化,这时泛型便应运而生。

    ArrayList <String> al = new ArrayList() <String>;
    al.add("one"):
    //al.add(1);//编译不通过
    Employee emp=employeeList.get(0);//不需要强制类型转换
    泛型类
     1 /*
     2  * 局限性,一旦类确定, 就必行用相同的数据类型
     3  * 
     4  * */
     5 class Student {
     6     public String getName() {
     7         return "student";
     8     }
     9 }
    10 
    11 class Worker {
    12 
    13 }
    14 
    15 class Tool<T> {
    16     private T t = null;
    17 
    18     public void setMyClass(T t) {
    19         this.t = t;
    20     }
    21 
    22     public T getMyClass() {
    23         return t;
    24     }
    25 
    26     @Override
    27     public String toString() {
    28         return t.getClass().getName();
    29     }
    30 }
    31 
    32 public class GenClass {
    33     public static void main(String[] args) {
    34         Tool<Student> s = new Tool<Student>();
    35         s.setMyClass(new Student());
    36         System.out.println(s.getMyClass());
    37     }
    38 }
    泛型类+泛型方法+静态泛型方法
     1 /**
     2  * 泛型类+泛型方法+静态泛型方法
     3  */
     4 class Gen<T> {
     5     /*
     6      * 使用泛型类的泛型
     7      */
     8     public void show(T t) {
     9         System.out.println(t);
    10     }
    11 
    12     /*
    13      * 泛型方法
    14      */
    15     public <M> void show1(M m) {
    16         System.out.println(m);
    17     }
    18 
    19     /*
    20      * 静态泛型方法
    21      */
    22     public static <S> void show2(S s) {
    23         System.out.println(s);
    24     }
    25 
    26 }
    27 
    28 public class GenClassAndMethod {
    29 
    30     public static void main(String[] args) {
    31         Gen.show2(123);
    32         Gen<String> g = new Gen<String>();
    33         g.show("325");
    34         // g.show(123);//报错
    35         g.show1(123);//
    36 
    37     }
    38 }
    泛型接口
     1 /**
     2  * 泛型接口
     3  */
     4 interface face<T> {
     5     public void show(T t);
     6 }
     7 
     8 /*
     9  * 实现接口的时候明确所操作的数据类型
    10  */
    11 class ImpClass1 implements face<String> {
    12 
    13     @Override
    14     public void show(String s) {
    15         System.out.println(s);
    16     }
    17 }
    18 
    19 /*
    20  * 实现接口的时候不明确所操作的数据类型
    21  * 
    22  * 用户操作的时候在定义数据类型
    23  */
    24 class ImpClass2<T> implements face<T> {
    25 
    26     @Override
    27     public void show(T s) {
    28         System.out.println(s);
    29     }
    30 }
    31 
    32 public class GenInterfase {
    33     public static void main(String[] args) {
    34         ImpClass1 impClass1 = new ImpClass1();
    35         impClass1.show("123");
    36         ImpClass2<Integer> i2 = new ImpClass2<Integer>();
    37         // i2.show("1243");//报错
    38         i2.show(123);
    39     }
    泛型?占位符
     1 package bin.ykb.advanced;
     2 
     3 import java.util.ArrayList;
     4 import java.util.Iterator;
     5 
     6 /**
     7  * 占位符
     8  */
     9 
    10 public class Placeholder {
    11     private static void show1(ArrayList<?> as) {//直接利用占位符对操作类型进行占位,对任意类型的ArrayList<> 都可以操作,原理和泛型方法差不多
    12         Iterator<?> i = as.iterator();
    13         while (i.hasNext()) {
    14             System.out.println(i.next());
    15         }
    16     }
    17 
    18     private static void show2(ArrayList<String> as) {// 这是为ArrayList<String>量身定做打印,没有什么扩展性
    19         Iterator<String> i = as.iterator();
    20         while (i.hasNext()) {
    21             System.out.println(i.next());
    22         }
    23     }
    24 
    25     public static void main(String[] args) {
    26         ArrayList<String> as = new ArrayList<String>();
    27         as.add("a");
    28         as.add("b");
    29         as.add("c");
    30 
    31         ArrayList<Integer> ai = new ArrayList<Integer>();
    32         ai.add(1);
    33         ai.add(2);
    34         ai.add(3);
    35 
    36         show1(as);
    37         show1(ai);
    38         System.out.println("============");
    39         show2(as);
    40         // show2(ai);
    41     }
    42 }

     最后就是泛型限定。

    <? extends Person> 参数只能是Person或Person 类的子类

      
    <? super Person> 参数只能是Person,或Person类的父类

      参见java.util.Collections  中的方法

      public static <T> boolean addAll(Collection<? super T> c, T... elements)

     参考:

        http://blog.csdn.net/jiang_bing/article/details/6912115

    转载请注明出处:

    博客园_yokoboy

    http://www.cnblogs.com/yokoboy/archive/2012/07/25/2608165.html

  • 相关阅读:
    「专题总结」后缀自动机
    「专题总结」回文自动机
    「专题总结」后缀数组
    2.11毕设进度
    2.10毕设进度
    2.09毕设进度
    2.08毕设进度
    2.07毕设进度
    2.06毕设进度
    2.05毕设进度
  • 原文地址:https://www.cnblogs.com/yokoboy/p/2608100.html
Copyright © 2020-2023  润新知