泛型
泛型提供了編譯時型別安全檢測機制,該機制允許程式設計師在編譯時檢測到非法的型別。
理解
為了可以進一步理解泛型,我們先來看一個問題
需求:
編寫一個程式,在ArrayList中新增三個物件,類中要有name、age屬性,輸出物件的name、age屬性
- 首先,我們先用傳統方法進行編寫
package com.sxny;
import java.util.ArrayList;
public class text {
public static void main(String[] args) {
ArrayList arrayList = new ArrayList();
arrayList.add(new Person("王五",55));
arrayList.add(new Person("李四",12));
arrayList.add(new Person("王五",8));
arrayList.add(new Animal("奶蓋",2));
for (Object o:arrayList){ //增強for迴圈
Person person = (Person)o;
System.out.println(person);
}
}
}
class Person{
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
class Animal{
private String name;
private int age;
public Animal(String name,int age){
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "Animal{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
從上圖我們可以看到,用傳統方法,會出現ClassCastException異常, 其原因主要是傳統方法中,需要進行型別的轉換。Person在進入Arraylist中時會轉換成Object型別,在取出時又會轉回Person型別。
- 針對以上問題,現在我們利用泛型來解決
package com.sxny;
import java.util.ArrayList;
public class text {
public static void main(String[] args) {
ArrayList<Person> arrayList = new ArrayList<Person>();
arrayList.add(new Person("王五",55));
arrayList.add(new Person("李四",12));
arrayList.add(new Person("王五",8));
// arrayList.add(new Animal("奶蓋",2));
for (Object o:arrayList){ //增強for迴圈
Person person = (Person)o;
System.out.println(person);
}
}
}
class Person{
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
class Animal{
private String name;
private int age;
public Animal(String name,int age){
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "Animal{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
在建立Arraylist時限制了新增元素的型別, Arraylist
使用泛型的好處
- 編譯時,檢查新增的元素,增加了安全性。
- 無需資料型別的轉換,提高了效率。
- 不再提示警告。
類萬用字元
通常類萬用字元使用 ?代替具體的型別引數。例如,List<?>
邏輯上是List<Integer>
、List<String>
等所有List<型別>
的父類。