java 泛型 入门

泛型,正如其名称所暗示的,它是一种方法,通过它可以编写出更“泛化”的代码,这些代码对于它们能够作用的类型具有更少的限制,因此单个的代码可以应用到更多的类上。
 
泛型的主要目的之一就是:用来指定容器要持有什么类型的对象,而且有编译器来保证类型的正确性。
 
泛型的核心概念:告诉编译器想使用什么类型,然后编译器帮你处理一切细节。
 
使用泛型类型机制的最吸引人的地方,就是在使用容器类的地方,这些类包括各种List、各种Set、各种Map。如果没有泛型,很容易误将各种类型放入同一个List。
 
类型参数:
     在类定义时,暂时不指定类型,而是稍后再决定具体使用什么类型;
     在类定义时,用尖括号括住,放在类名后面;
     在使用这个类的时候,用实际的类型代替类型参数。
例如:
 1 public class Holder<T> { //定义泛型类
 2         private T a ;
 3        
 4         public T getA() {
 5                return a ;
 6        }
 7 
 8         public void setA(T a) {
 9                this.a = a;
10        }
11 
12         public static void main(String[] args) {
13               Holder<String> h=new Holder<String>();  //应用泛型类
14               h.setA( "abcd");
15               
16               String str=h.getA();
17               System. out.println(str);
18               
19               System. out.println(h.getClass().getName());
20        }
21 
22 }
输出:
abcd
edu.shao.generics.Holder
小结:
泛型和其他类型差不多,只不过它们碰巧有类型参数罢了:h的类型还是Holder,而不是Holder<String>
在使用泛型时,我们只需要指定它们的名称和类型参数列表即可。
 
泛型接口
 1 interface Generator<T>{ //定义泛型接口
 2        T next();
 3 }
 4 
 5 public class Fibonacci implements Generator<Integer>{  //应用泛型接口
 6         private int count =0;
 7 
 8         public Integer next() {
 9                int value=fib(count );
10                count++;
11                return value;
12        }
13        
14         private int fib(int n) {
15                if (n<2) {
16                       return 1;
17               }
18                return fib(n-2)+fib(n-1);
19        }
20        
21         public static void main(String[] args) {
22               Generator<Integer> generator= new Fibonacci();
23                for (int i = 0; i < 20; i++) {
24                      System. out.print(generator.next()+" " );
25               }
26        }
27 }
 
泛型方法
     定义泛型方法:将泛型参数列表至于返回值之前。
     基本指导原则:无论何时,只要你能做到,就应该尽量使用泛型方法。
     是否拥有泛型方法,与其所在的类是否是泛型没有关系。
 
例如:
 1 public class GenericMethods {
 2         public static <E> List<E> newList(){
 3                return new ArrayList<E>();
 4        }
 5        
 6         public <T> void printClass(T x){
 7               System. out.println(x.getClass().getName());
 8        }
 9        
10         public <T,U> void printClasses(T x,U y){
11               System. out.println(x.getClass().getName()+" "+y.getClass().getName());
12        }
13 
14         public static void main(String[] args) {
15               GenericMethods genericMethods= new GenericMethods();
16               
17               List<Long> longList=GenericMethods. newList();//参数类型推断
18               
19               genericMethods.printClass(longList);
20               genericMethods.printClass(0x123);
21               
22               genericMethods.printClasses(123, 123L);
23               genericMethods.printClasses(1.2, 1.2F);
24        }
25 }
输出:
java.util.ArrayList
java.lang.Integer
java.lang.Integer java.lang.Long
java.lang.Double java.lang.Float
 
 
posted @ 2013-02-22 11:00  windlaughing  阅读(346)  评论(0编辑  收藏  举报