泛型
學生成績可能是數字類型,也可能是字符串類型,如何存放可能出現的兩種類型呢:
public class Score {String name;String id;Object value; //因為Object是所有類型的父類,因此既可以存放Integer也能存放Stringpublic Score(String name,String id,Object value){this.name=name;this.id=id;this.value=value;}
}
以上方法雖然解決了多種類型存儲的問題,但是Object類型在編譯階段并不具有良好的類型判斷能力,很容易出現:
public static void main(String[] args) {Score score=new Score("數學","aa","優秀"); //是String類型的Integer number=(Integer) score.getValue();//獲取成績需要進行強制類型轉換,雖然并不是一開始的類型,但是編譯不會報錯}
由于是Object類型,所以并不能直接判斷存儲的到底是String還是Integer,取值只能進行強制類型轉換,顯然無法在編譯期確定類型是否安全,項目中代碼量非常大,進行類型比較又會導致額外的開銷和增加代碼量,如果不比較又容易出現類型轉換異常,代碼的健壯性有所欠缺。
為了解決以上問題,JDK5新增了泛型,它能夠在編譯階段檢查類型安全,大大提升開發效率。
泛型類
定義泛型類:
public class Score<T> { //泛型類需要使用<>,在里面添加1-N個類型變量String name;String id;T value; //T會根據使用時提供的類型自動變成對應類型public Score(String name,String id,T value){ //這里的T可以是任何類型,但是一旦確定就不能修改了this.name=name;this.id=id;this.value=value;}
}
public static void main(String[] args) {Score<String> score=new Score<>("數學","aa","優秀");//使用時跟上<>并在其中填寫明確要使用的類型}
泛型將數據類型控制在了編譯階段, 在編寫代碼時就能明確泛型的類型,類型不符合將無法編譯通過。
1、因為是具體使用對象時才會明確具體類型,所以說靜態方法中不能用。
2、方法中使用待確定類型的變量時,因為不明確類型則會默認這個變量是一個Object類型的變量(即不能使用String等類型中的方法)。可對其進行強制類型轉換但沒必要。
3、不能通過這個不確定的類型變量直接創建對象和對應的數組。
4、具體類型不同的泛型類變量,不能使用不同的變量進行接收。
5、如果要讓某個變量支持引用確定了任意類型的泛型,可以使用?通配符。
public static void main(String[] args) {Score<String> score=new Score<>("數學","aa","優秀");Score<?>score1=score;}
?如果使用通配符,由于類型不確定,所以說具體類型同樣會變成Object。
6、泛型變量可以定義多個,多個類型變量用,隔開。在使用時需要將這三種類型都進行明確指令。
7、泛型只能確定為一個引用類型,不支持基本類型。
要存放基本數據類型的值,我們只能使用對應的包裝類。
如果是基本類型的數組,因為數組本身是引用類型,所以是可以的。