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