泛型(Generic)小结

    技术2022-05-20  58

    泛型(Generic)小结

    JDK5以前,对象保存到集合中就会失去其特性,取出时通常要程序员手工进行类型的强制转换,这样不可避免就会引发程序的一些安全性问题。例如:

    ArrayList list = new ArrayList();

    list.add("abc");

    Integer num = (Integer) list.get(0);  //运行时会出错,但编码时发现不了

    list.add(new Random());

    list.add(new ArrayList());

    for(int i=0;i<list.size();i++){

                 (?)list.get(i);          //此处取出来的对象应转换成什么类型

    }

     JDK5中的泛形允许程序员在编写集合代码时,就限制集合的处理类型,从而把原来程序运行时可能发生问题,转变为编译时的问题,以此提高程序的可读性和稳定性(尤其在大型程序中更为突出)

    注意:泛型是提供给javac编译器使用的,它用于限定集合的输入类型,让编译器在源代码级别上,即挡住向集合中插入非法数据。但编译器编译完带有泛形的java程序后,生成的class文件中将不再带有泛形信息,以此使程序运行效率不受到影响,这个过程称之为擦除

    泛形的基本术语,以ArrayList<E>为例:<>念着typeof

             ArrayList<E>中的E称为类型参数变量

             ArrayList<Integer>中的Integer称为实际类型参数

             整个称为ArrayList<E>泛型类型

             整个ArrayList<Integer>称为参数化的类型ParameterizedType

    定义泛型 

    1、在方法上定义

           public <T> void test1(T l){  //应用的对象}

           public  static <T> void test2(T l){  //应用的对象}

           public <T> int test3(T l){  //应用的对象

                  return 0;

           }

           public <T> List<T> test4(){

                  return null;

           }

    2、在类上定义泛型

    public class Demo03<T,E> {

               public void test1(T entity){ }

               public List<T> test2(){

                  return null;

               }

               注意:在类上声明的泛型不能够用在static修饰的方法上

              public  static <TT> void test2(TT l){  //应用的对象}

    }

    List数组

    @Test

           public void test1() {

                  List<String> list = new ArrayList<String>();

                  list.add("adc");

                  list.add("def");

                  list.add("cde");

                  Iterator<String> it = list.iterator();

                  while (it.hasNext()) {

                         String value = it.next();

                         System.out.println(value);

                  }

                  for(String value:list){

                         System.out.println(value);

                  }

           }

    Map

    @Test

           public void test2() {

                  Map<Integer, String> map = new HashMap<Integer, String>();

                  map.put(1, "redarmy");

                  map.put(2, "mj");

                  map.put(3, "xiaoshenyang");

                  Set<Map.Entry<Integer, String>> entries = map.entrySet();

                  for (Map.Entry<Integer, String> entry : entries) {

                         System.out.println(entry.getKey());

                         System.out.println(entry.getValue());

                  }

           }

    @Test

           public void test3() {

                  Map<Integer, String> map = new HashMap<Integer, String>();

                  map.put(1, "redarmy");

                  map.put(2, "mj");

                  map.put(3, "xiaoshenyang");

                  Set<Integer> keys = map.keySet();

                  Iterator<Integer> it = keys.iterator();

                  while (it.hasNext()) {

                         int key = it.next();

                         System.out.println(key + "  " + map.get(key));

                  }

                  for(Integer key : keys){

                         System.out.println(key + "  " + map.get(key));

                  }

           }

    @Test

           public void test4(){

    //       List<String> list = new ArrayList<Object>();

    //List<Object> list1 = new ArrayList<String>();

             //上边两个表达式不正确jdk1.4之前没有泛型  jdk1.5之后才有泛型的

                  List<String> list = new ArrayList();

                  List list1 = new ArrayList<String>();

                 

           }

    /** 实现一个简单的数组位置的交换 */          public static <T> void test(T arr[],int i,int j){                 T temp = arr[i];                 arr[i]=arr[j];                 arr[j]=temp;          } /* 实现数组的倒序 */        public static <T> void test1(T arr[]) {               int startindex = 0;               int endindex = arr.length - 1;               for (;;) {                      if (startindex >= endindex) {                             break;                      }                    T temp = arr[startindex];                    arr[startindex] = arr[endindex];                    arr[endindex] = temp;                    startindex++;                    endindex--;               }      }      public static void main(String[] args) {              Integer arr[]={1,2,3,4};             /*test(arr,0,2);              for(int ar:arr){                    System.out.print("["+ar+","+"]");           }*/         test1(arr);              for (int ar : arr) {                    System.out.print("[" + ar + "," + "]");              }

                 testChange();         }         public static void testChange(){                 int i=10;                 int j=111;                 i=i^j;                 j=i^j;                 i=i^j;                System.out.println("i="+i+"   "+"j="+j);          }

     


    最新回复(0)