Java集合框架(二)泛型
阿新 • • 發佈:2022-02-04
Java集合框架(二)泛型
泛型
什麼是泛型
- 引數化型別:將型別作為引數傳遞
泛型的常見形式
- 泛型類
- 泛型介面
- 泛型方法
泛型的語法
- <T,........> 其中T稱為型別佔位符(在實際使用的時候這裡會填入型別),它表示一種引用型別
程式碼例項
泛型類
-
類名<T,T...>
-
T表示引用型別,不能是基礎型別,如果表示多個引用型別則用逗號隔開
-
泛型不能用new例項化,因為不能保證
-
舉例1:
泛型類:
public class Room<T> { //T代表一種資料型別,在使用的時候為T賦值(使用的時候再決定T做什麼資料型別) //使用泛型T //建立變數 T t; //新增方法 public void show(T t){ System.out.println(t); } //泛型作為方法的返回值 public T getT(){ return t; } }
使用泛型類
主函式:
public class Demo07 { public static void main(String[] args) { //使用泛型類建立物件 Room<String> room = new Room<>(); //將佔位符T命為String,則Room類裡面的T代表String型別 //所以t是String型別 room.t = "史小鵬"; System.out.println(room.getT()); } } //輸出: 史小鵬
-
舉例2:
泛型類:
public class Room2<A,B>{ A s1; B s2; public A getS1(){ return s1; } public B getS2(){ return s2; } }
使用泛型類
主函式:
public class Demo08{ public static void main(String[] args) { //使用泛型類建立物件 //<>裡只能寫引用物件,不能寫基礎物件,例如int是基礎物件所以不能寫 /* 1、Integer是int的包裝類,int則是java的一種基本資料型別 2、Integer變數必須例項化後才能使用,而int變數不需要 3、Integer實際是物件的引用,當new一個Integer時,實際上是生成一個指標指向此物件;而int則是直接儲存資料值 */ Room2<String, Integer> room2 = new Room2<>(); room2.s1="史小鵬"; room2.s2=18; System.out.println(room2.getS1()+":"+room2.getS2()); } } //輸出: 史小鵬:18
泛型介面
-
由於介面不能例項,所以介面沒有例項變數,預設都是常量(必須賦值)
-
由於T(泛型)不能例項化,所以沒有泛型常量,不能直接賦初值
-
舉例1(實現類裡指明T的泛型型別):
泛型介面:
public interface Room3<T> { String name = "史小鵬"; T server(T t);//方法 }
實現類:
//介面Room3的實現類 public class Room3_1 implements Room3<String>{ String t; public String server(String t){ this.t=t+"242"; return this.t; } }
主函式:
public class Demo09 { public static void main(String[] args) { Room3_1 room3_1 = new Room3_1(); System.out.println(room3_1.name); //使用實現類的方法 System.out.println(room3_1.server("工作")); } } //輸出: 史小鵬 工作242
-
舉例2(實現類也是泛型類,不指明T泛型型別):
泛型介面:
public interface Room3<T> { String name = "史小鵬"; T server(T t);//方法 }
實現類:
//介面Room3的實現類 //泛型類的型別是什麼,則泛型介面的型別就是什麼 public class Room3_1<T> implements Room3<T>{ public T server(T t){ return t; } }
主函式:
public class Demo09 { public static void main(String[] args) { Room3_1<String> room3_1 = new Room3_1<>(); System.out.println(room3_1.server("sxp史小鵬")); } } //輸出: sxp史小鵬
泛型方法
-
方法中的型別不用傳遞,它會根據你所傳入的資料自動判斷型別
-
舉例:
泛型方法:
public class Room4 { public <T> void show(T t){ System.out.println("泛型方法"+t); } public <A> A show2(A a){ return a; } }
主函式:
//呼叫泛型方法 public class Demo10 { public static void main(String[] args) { Room4 room4 = new Room4(); //型別不用傳遞,它會根據你所傳入的資料自動判斷型別 room4.show("abc"); System.out.println(room4.show2(200)); } } //輸出: 泛型方法abc 200
泛型的好處
- 提高程式碼的重用性
- 防止型別轉換異常,提高程式碼的安全性
泛型與集合框架
-
集合框架中是帶有泛型的,不使用泛型的話預設是Object型別,但會導致其中的資料元素都是Object型別
-
舉例1:
public class Demo11 { public static void main(String[] args) { ArrayList<Integer> list = new ArrayList<>(); list.add(10); list.add(20); System.out.println(list.get(0)+list.get(1)); } } //輸出: 30
-
舉例2:
學生類:
public class Student { private String name; private int age; public Student() { } public Student(String name, int age) { this.name = name; this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } //重寫toString方法 public String toString(){ return this.name+" "+this.age; } }
主函式:
import java.util.ArrayList; import java.util.Iterator; public class Demo12 { public static void main(String[] args) { ArrayList<Student> arrayList = new ArrayList<>(); Student s1 = new Student("張三",18); Student s2 = new Student("李四",19); Student s3 = new Student("王五",20); Student s4 = new Student("趙六",21); //新增元素 arrayList.add(s1); arrayList.add(s2); arrayList.add(s3); arrayList.add(s4); Iterator iterator = arrayList.iterator(); while(iterator.hasNext()){ System.out.println(iterator.next()); } } } //輸出: 張三 18 李四 19 王五 20 趙六 21