Java泛型學習
阿新 • • 發佈:2022-05-04
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 }