1. 程式人生 > 其它 >Java泛型學習

Java泛型學習

1、泛型的概念

    泛型即“引數化型別”,就比如我們定義方法的時候,定義一個變數,稱為形參,變數值根據傳進去的實參的值不同而改變。而泛型的出現,就是為了解決型別也能根據傳進去的型別改變的問題,所以稱為引數化型別,也就是說所操作的資料型別被指定為一個引數。主要用在定義方法、類、集合上,可以很好的減少程式碼的重複。

2、泛型中的識別符號含義

 E - Element (在集合中使用,因為集合中存放的是元素)

 T - Type(Java 類)

 K - Key(鍵)

 V - Value(值)

 N - Number(數值型別)

? -  表示不確定的java型別

 S、U、V  - 2nd、3rd、4th types

3、定義一個泛型方法

    首先,泛型的宣告,必須在方法的修飾符(public,static,final,abstract等)之後,返回值宣告之前。然後,和泛型類一樣,可以宣告多個泛型,用逗號隔開

 1 import java.util.ArrayList;
 2 import java.util.List;
 3 
 4 /**
 5  * Created by Administrator on 2017/6/5.
 6  * <p>
 7  * Description:
 8  */
 9 public class One
10 {
11     public static void main(String[] args)
12     {
13         List<Integer> integers=new ArrayList<>();
14         integers.add(111);
15         integers.add(222);
16 
17         List<String> list=new ArrayList<>();
18         list.add("111");
19         list.add("222");
20 
21         System.out.println(print(integers,list));
22 
23     }
24 
25     public static <T1,T2> T1 print(List<T1> list,List<T2> list2){
26         T1 t1 = list.get(0);
27         return t1;
28     }
29 }

4、定義一個泛型類

 1 /**
 2  * Created by Administrator on 2017/6/5.
 3  * <p>
 4  * Description:
 5  */
 6 public class Box<T>//這裡可以定義多個泛型,用逗號分割
 7 {
 8     private String name;
 9     private T t;
10 
11     public Box()
12     {
13 
14     }
15 
16     public Box(T t, String name)
17     {
18         this.t = t;
19         this.name = name;
20     }
21 
22     public String getName()
23     {
24         return name;
25     }
26 
27     public void setName(String name)
28     {
29         this.name = name;
30     }
31 
32     public T getT()
33     {
34         return t;
35     }
36 
37     public void setT(T t)
38     {
39         this.t = t;
40     }
41 }
 1 /**
 2  * Created by Administrator on 2017/6/5.
 3  * <p>
 4  * Description:
 5  */
 6 public class Two
 7 {
 8     public static void main(String[] args)
 9     {
10         Box<String> box=new Box<>("stirng","小明");
11         String t = box.getT();
12         System.out.println(t);
13 
14         Box<Integer> box1=new Box<>(123456,"小紅");
15         Integer t1 = box1.getT();
16         System.out.println(t1);
17     }
18 }

5、泛型類的繼承

父類:

 1 package fan;
 2 
 3 /**
 4  * Created by Administrator on 2017/6/5.
 5  * <p>
 6  * Description:
 7  */
 8 public class Person<T>
 9 {
10     private String code;
11     private String name;
12     private T t;
13 
14     public String getCode()
15     {
16         return code;
17     }
18 
19     public void setCode(String code)
20     {
21         this.code = code;
22     }
23 
24     public String getName()
25     {
26         return name;
27     }
28 
29     public void setName(String name)
30     {
31         this.name = name;
32     }
33 
34     public T getT()
35     {
36         return t;
37     }
38 
39     public void setT(T t)
40     {
41         this.t = t;
42     }
43 
44     @Override
45     public String toString()
46     {
47         return "Person{" + "code='" + code + ''' + ", name='" + name + ''' + ", t=" + t + '}';
48     }
49 }

兩個子類

 1 package fan;
 2 
 3 /**
 4  * Created by Administrator on 2017/6/5.
 5  * <p>
 6  * Description:
 7  */
 8 public class Student extends Person<Integer>
 9 {
10 }
package fan;

/**
 * Created by Administrator on 2017/6/5.
 * <p>
 * Description:
 */
public class Teacher extends Person<String>
{

}

泛型輔助類

 1 package fan;
 2 
 3 /**
 4  * Created by Administrator on 2017/6/5.
 5  * <p>
 6  * Description:
 7  */
 8 public class BuildHelper<T extends Person>//這裡的意思是對泛型進行限制,輸入的泛型只能是繼承Person類的
 9 {
10     private Class<T> clazz;
11 
12     public BuildHelper(){
13 
14     }
15     //構造器,僅限自己呼叫
16     private BuildHelper(Class<T> clazz){
17         this.clazz=clazz;
18     }
19 
20     public static <T extends Person> BuildHelper<T> with(Class<T> clazz){
21         return new BuildHelper<T>(clazz);
22     }
23 
24     //返回泛型類
25     public T build(){
26         try {
27             T t = clazz.newInstance();
28             return t;
29         } catch (InstantiationException e) {
30             e.printStackTrace();
31         } catch (IllegalAccessException e) {
32             e.printStackTrace();
33         }
34         return null;
35     }
36 }

測試

 1 package fan;
 2 
 3 /**
 4  * Created by Administrator on 2017/6/5.
 5  * <p>
 6  * Description:
 7  */
 8 public class Main
 9 {
10     public static void main(String[] args)
11     {
12         BuildHelper<Student> studentBuildHelper = BuildHelper.with(Student.class);
13         Student student = studentBuildHelper.build();
14         student.setT(123);
15         student.setCode("123");
16         student.setName("123");
17 
18         BuildHelper<Teacher> teacherBuildHelper = BuildHelper.with(Teacher.class);
19         Teacher teacher = teacherBuildHelper.build();
20         teacher.setT("1234");
21         teacher.setCode("1234");
22         teacher.setName("1234");
23 
24         System.out.println(student);
25         System.out.println(teacher);
26     }
27 }