黑马程序员技术交流社区

标题: 泛型总结和练习 [打印本页]

作者: Sakuratossi    时间: 2014-9-1 11:19
标题: 泛型总结和练习

泛型定义:
jdk 1.5 新特性! 是类型的一种拓展,相当于类型占位符,就好比方法的形式参数是实际参数的占位符一样.
泛型能保证大型应用程序的类型安全和良好的维护性;

使用泛型的好处:
类型安全,使编译器对泛型定义的类型做判断限制.如保证TreeSet里的元素类型必须一致;消除强制类型的转换,如,使用Comparable比较时每次都需要类型强转;


泛型类

在类声明时通过一个标识符表示类中某个字段的类型或者某个方法的返回值或参数的类型,这样在类声明或实例化的时候只要指定自己需要的类型就ok。

声明带泛型的类:
class 类名<泛型类型1,泛型类型2……>{
     泛型类型  变量名;
     泛型类型  方法名(){}
     返回值类型 方法名(泛型类型 变量名){}
}
使用带泛型的类:
类名<具体类> 对象名 = new 类名<具体类>();


泛型方法

方法中可定义泛型参数,形参的参数类型就是实参的类型。
格式:
<泛型标签> 返回值类型 方法名([泛型标签 参数]…)


泛型的上限与下限

设置泛型对象的上限使用extends,表示参数类型只能是该类型或该类型的子类:
声明对象:类名<? extends 类> 对象名
定义类:类名<泛型标签 extends 类>{}
设置泛型对象的下限使用super,表示参数类型只能是该类型或该类型的父类:
声明对象:类名<? super 类> 对象名称
定义类:类名<泛型标签 extends类>{}


  1. // 泛型的简单示例
  2. class GenericDemo1
  3. {
  4.         public static void main(String[] args)
  5.         {
  6.                 Demo d = new Demo();

  7.                 d.show(new Integer(5));
  8.                 d.print('s');
  9.                 d.writeStatic(true);

  10.                 Demo1<Integer> d1 = new Demo1<Integer>();
  11.                 d1.show(new Integer(1));
  12.                 d1.writeStatic("abc");
  13.                 d1.writeStatic1(new Integer(14));
  14.         }
  15. }

  16. // 泛型方法:
  17. class Demo
  18. {
  19.         public <T> void show(T t)
  20.         {
  21.                 System.out.println("show----" + t);
  22.         }
  23.        
  24.         public <Q> void print(Q t)
  25.         {
  26.                 System.out.println("print---" + t);
  27.         }

  28.         public static <M> void writeStatic(M m)
  29.         {
  30.                 System.out.println("writeStatic---" + m);
  31.         }
  32. }


  33. //泛型类:

  34. class Demo1<T>
  35. {
  36.         public void show(T t)
  37.         {
  38.                 System.out.println("show1----" + t);
  39.         }
  40.        
  41.         public void print(T t)
  42.         {
  43.                 System.out.println("print1---" + t);
  44.         }

  45. //        public static void writeStatic1(T t)  // 错误: 无法从静态上下文中引用非静态 类型变量 T
  46. //        {
  47. //                System.out.println("writeStatic1---" + t);
  48. //        }

  49.         public static <W> void writeStatic(W w)
  50.         {
  51.                 System.out.println("writeStatic1---" + w);
  52.         }
  53. }
复制代码


泛型在集合中的应用

  1. import java.util.*;

  2. class GenericDemo
  3. {
  4.         public static void main(String[] args)
  5.         {
  6.                 TreeSet<String> ts = new TreeSet<String>(new StrComparator());

  7.                 ts.add("lide");
  8.                 ts.add("flieedde");
  9.                 ts.add("liddgde");
  10.                 ts.add("hhhidd");

  11.                 for (Iterator<String> it = ts.iterator(); it.hasNext(); )
  12.                 {
  13.                         String s = it.next();
  14.                         sop(s);
  15.                 }

  16.         }

  17.         public static void sop(Object obj)
  18.         {
  19.                 System.out.println(obj);
  20.         }
  21. }

  22. class StrComparator implements Comparator<String>  // 不用类型强转
  23. {
  24.         public int compare(String o1,String o2)
  25.         {
  26.                 String s1 = o1;
  27.                 String s2 = o2;

  28.                 int num = new Integer(s2.length()).compareTo(new Integer(s1.length()));  //如果倒序排列,把o1和
  29.                                                                                                                                                                 //o1换位
  30.                 if(num == 0)
  31.                 {
  32.                         return s1.compareTo(s2);
  33.                 }
  34.                 return num;
  35.         }
  36. }
复制代码





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2