我們來看下面的代碼:
public class Demo03 {
public static void main(String[] args) {
MyArray myArray = new MyArray();
myArray.setValue(0,10);
myArray.setValue(1,"hello");
String pos = myArray.getPos(0); //error
System.out.println(pos);
}
}
class MyArray {
Object[] arr = new Object[10];
//獲取下標(biāo)為pos的元素
public Object getPos(int pos) {
return this.arr[pos];
}
//在pos位置放入val元素
public void setValue(int pos,Object val) {
this.arr[pos] = val;
}
}
通過上面的代碼我們發(fā)現(xiàn),雖然在這種情況下,當(dāng)前數(shù)組任何數(shù)據(jù)都可以存放,但是,更多情況下,我們還是希望他只能夠持有一種數(shù)據(jù)類型。而不是同時(shí)持有這么多類型。
泛型語法:
class 泛型類名稱<類型形參列表> {
// 這里可以使用類型參數(shù)
}
class ClassName<T1, T2, ..., Tn> {
}
class 泛型類名稱<類型形參列表> extends 繼承類/* 這里可以使用類型參數(shù) */ {
// 這里可以使用類型參數(shù)
}
class ClassName<T1, T2, ..., Tn> extends ParentClass<T1> {
// 可以只使用部分類型參數(shù)
}
我們可以把上面的代碼用泛型進(jìn)行改寫:
public class Demo03 {
public static void main(String[] args) {
MyArray<Integer> myArray = new MyArray<>();
myArray.setValue(0,10);
myArray.setValue(1,11);
}
}
class MyArray<T> {
T[] arr = (T[])new Object[10];
public T getPos(int pos) {
return this.arr[pos];
}
public void setValue(int pos,T val) {
this.arr[pos] = val;
}
}
代碼解釋:
類名后的 尖括號(hào)T 代表占位符,表示當(dāng)前類是一個(gè)泛型類。
不能new泛型類型的數(shù)組,比如T[] t = new T[5];
類型后加入 Integer 指定當(dāng)前類型
不需要進(jìn)行強(qiáng)制類型轉(zhuǎn)換
編譯器會(huì)在存放元素的時(shí)候幫助我們進(jìn)行類型檢查。
泛型類的使用
泛型類<類型實(shí)參> 變量名; // 定義一個(gè)泛型類引用
new 泛型類<類型實(shí)參>(構(gòu)造方法實(shí)參); // 實(shí)例化一個(gè)泛型類對(duì)象
比如:
MyArray<Integer> list = new MyArray<Integer>();
//等價(jià)于 MyArray<Integer> list = new MyArray<>();
注意:泛型只能接受引用類型,所有的基本數(shù)據(jù)類型必須使用包裝類。
泛型的上界
在定義泛型類時(shí),有時(shí)需要對(duì)傳入的類型變量做一定的約束,可以通過類型邊界來約束。
class 泛型類名稱<類型形參 extends 類型邊界> {
//
}
比如:
public class MyArray<E extends Number> {
//
}
這樣它就只接受 Number 的子類型作為 E 的類型實(shí)參。
MyArray<Integer> str1; // 正常,因?yàn)?Integer 是 Number 的子類型
MyArray<String> str2; // 編譯錯(cuò)誤,因?yàn)?String 不是 Number 的子類型
我們來看這道練習(xí):寫一個(gè)泛型,實(shí)現(xiàn)一個(gè)方法,方法是求指定類型數(shù)組的最大值文章來源:http://www.zghlxwxcb.cn/news/detail-727488.html
public class Demo02 {
public static void main(String[] args) {
FindMaxValue<Integer> tFindMaxValue = new FindMaxValue<>();
Integer[] array = {1,4,6,2,10};
Integer max = tFindMaxValue.findMax(array);
System.out.println(max);
}
}
//泛型類
//<T extends Comparable<T>> T一定是實(shí)現(xiàn)了Comparable接口
class FindMaxValue <T extends Comparable<T>> {
public T findMax(T[] arr) {
T max = arr[0];
for (int i = 1; i < arr.length; i++) {
if (max.compareTo(arr[i])<0){
max = arr[i];
}
}
return max;
}
}
上面的代碼我們也可以使用泛型方法來寫文章來源地址http://www.zghlxwxcb.cn/news/detail-727488.html
public class Demo02 {
public static void main(String[] args) {
Integer[] array1 = {1,4,6,2,10};
Integer max1 = FindMaxValue1.findMax(array1);
System.out.println(max1);
}
}
class FindMaxValue1 {
//泛型方法
public static <T extends Comparable<T>> T findMax(T[] arr) {
T max = arr[0];
for (int i = 1; i < arr.length; i++) {
if (max.compareTo(arr[i])<0){
max = arr[i];
}
}
return max;
}
}
到了這里,關(guān)于【數(shù)據(jù)結(jié)構(gòu)】初識(shí)泛型的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!