泛型整理
1.泛型的使用环境
泛型是在jdk1.5及1.5以上的版本可以使用。
2.泛型的参数命名约定
• E - Element,主要由Java Collections框架使用。
• K - Key,主要用来表示地图的参数类型。
• V - 值,主要用于表示地图的参数类型值。
• N - 数字,主要用于表示数字。
• T - Type,主要用于表示第一个泛型类型参数。
• S - Type,主要用于表示第二个泛型类型参数。
• U - Type,主要用来表示第三个泛型类型参数。
• V - Type,主要用于表示第四个泛型类型参数。
3.普通泛型实例
1 public class GenericsDemo {
2
3 public static void main(String[] args) {
4 // TODO Auto-generated method stub
5 Student<String,Integer> student = new Student<String,Integer>();
6 student.setAge(25);
7 student.setName("大志");
8
9 System.out.println("获取到的数据为 :"+student.getName()+"&&"+student.getAge());
10 fun(student) ;
11
12 }
13
14 public static void fun(Student<?,?> newStudent){
15 System.out.println("使用通配符的方式:"+newStudent.getName()+"&&"+newStudent.getAge());
16 }
17
18 }
19
20 class Student<T,S>{
21 private T name;
22 private S age;
23
24 public T getName() {
25 return name;
26 }
27 public void setName(T name) {
28 this.name = name;
29 }
30 public S getAge() {
31 return age;
32 }
33 public void setAge(S age) {
34 this.age = age;
35 }
36
37 }
注:这里有一点需要留意,那就是此处的代码14行中使用到了通配符<?>;
通配符可以表示任意的类型;
而<T>里面的内容只能替代输入时指定的类型。
4.受限泛型
受限泛型包括了两种:受限下界<T extends<S>>和受限上界<T super<S>>,使用这种方式也会使得代码变得更复杂,但对应的是可扩展得逻辑性确大大提高。
这里先解释下这两种方式区别:
1.<T extends<S>>这种方式表示:在调用使用这种受限泛型的方式时,T可以是S得子类,用集合表示即T是S得子集(可以S==T);
2.<T super<S>>这种方式表示:在调用使用这种受限泛型的方式时,S可以是T得子类,用集合表示即S是T得子集(可以S==T);
下面用图来描述一下这两种的区别:
1).受限下界<T extends<S>>:
2).受限上界<T super<S>>:
下面用代码来表示:
1 public class GenericsDemo {
2
3 public static void main(String[] args) {
4 // TODO Auto-generated method stub
5 Point<Integer> p1 = new Point<Integer>();
6 Point<Float> p2 = new Point<Float>();
7 p1.setT(10086);
8 p2.setT(10010F);
9 fun1(p1);
10 fun1(p2);
11 System.out.println("=======================");
12 Point<Number> p3 = new Point<Number>();
13 Point<Object> p4 = new Point<Object>();
14 p3.setT(5);
15 p4.setT(new Object());
16 fun2(p3);
17 fun2(p4);
18
19 }
20
21 public static void fun1(Point<? extends Number> p){// 只能接收Number及其Number的子类
22 System.out.println("受限泛型下界方式:"+p.getT());
23 }
24
25 public static void fun2(Point<? super Number> p){// 只能接收Number及其Object类型
26 System.out.println("受限泛型上界方式:"+p.getT());
27 }
28
29 }
30
31 class Point<T>{
32 private T t;
33
34 public T getT() {
35 return t;
36 }
37
38 public void setT(T t) {
39 this.t = t;
40 }
41
42 }