java泛型萬用字元和型別引數的範圍

2021-08-10 15:40:04 字數 2289 閱讀 4169

本節先講解如何限制型別引數的範圍,再講解萬用字元(?)。

在泛型中,如果不對型別引數加以限制,它就可以接受任意的資料型別,只要它是被定義過的。但是,很多時候我們只需要一部分資料型別就夠了,使用者傳遞其他資料型別可能會引起錯誤。例如,編寫乙個泛型函式用於返回不同型別陣列(integer 陣列、double 陣列等)中的最大值:

public t getmax(t array)

return max;

}

上面的**會報錯,doublevalue() 是 number 類及其子類的方法,不是所有的類都有該方法,所以我們要限制型別引數 t,讓它只能接受 number 及其子類(integer、double、character 等)。

通過 extends 關鍵字可以限制泛型的型別的上限,改進上面的**:

public t getmax(t array)

return max;

}

表示 t 只接受 number 及其子類,傳入其他型別的資料會報錯。這裡的限定使用關鍵字 extends,後面可以是類也可以是介面。如果是類,只能有乙個;但是介面可以有多個,並以「&」分隔,例如 。

這裡的 extends 關鍵字已不再是繼承的含義了,應該理解為 t 是繼承自 number 類的型別,或者 t 是實現了 xx 介面的型別。

上一節的例子中提到要定義乙個泛型類來表示座標,座標可以是整數、小數或字串,請看下面的**:

class point

public void setx(t1 x)

public t2 gety()

public void sety(t2 y)

現在要求在類的外部定義乙個 printpoint() 方法用於輸出座標,怎麼辦呢?

可以這樣來定義方法:

public void printpoint(point p)
我們知道,如果在使用泛型時沒有指名具體的資料型別,就會擦除泛型型別,並向上轉型為 object,這與不使用泛型沒什麼兩樣。上面的**沒有指明資料型別,相當於:

public void printpoint(pointp)
為了避免型別擦除,可以使用萬用字元(?):

public void printpoint(point<?, ?> p)
萬用字元(?)可以表示任意的資料型別。將**補充完整:

public class demo 

public static void printpoint(point<?, ?> p)

}class point

public void setx(t1 x)

public t2 gety()

public void sety(t2 y)

}

執行結果:

this point is: 10, 20

this point is: 東京180度, 北緯210度

但是,數字座標與字串座標又有區別:數字可以表示x軸或y軸的座標,字串可以表示地球經緯度。現在又要求定義兩個方法分別處理不同的座標,乙個方法只能接受數字型別的座標,另乙個方法只能接受字串型別的座標,怎麼辦呢?

這個問題的關鍵是要限制型別引數的範圍,請先看下面的**:

public class demo 

// 借助萬用字元限制泛型的範圍

public static void printnumpoint(point<? extends number, ? extends number> p)

public static void printstrpoint(point<? extends string, ? extends string> p)

}class point

public void setx(t1 x)

public t2 gety()

public void sety(t2 y)

}

執行結果:

x: 10, y: 20

gps: 東京180度,北緯210度

? extends number 表示泛型的型別引數只能是 number 及其子類,? extends string 也一樣,這與定義泛型類或泛型方法時限制型別引數的範圍類似。

不過,使用萬用字元(?)不但可以限制型別的上限,還可以限制下限。限制下限使用 super 關鍵字,例如 <? super number> 表示只能接受 number 及其父類。

**:

java泛型萬用字元和型別引數的範圍

在泛型中,如果不對型別引數加以限制,它就可以接受任意的資料型別,只要它是被定義過的。但是,很多時候我們只需要一部分資料型別就夠了,使用者傳遞其他資料型別可能會引起錯誤。例如,編寫乙個泛型函式用於返回不同型別陣列 integer 陣列 double 陣列等 中的最大值 public tgetmax t...

Java 泛型引數型別理解

泛型 generics extends super 1 泛型引數型別限制 1 泛型的引數型別只能是類 class 型別,而不能是簡單型別。2 可以宣告多個泛型引數型別,比如 同時還可以巢狀泛型,例如 3 泛型 的引數類 型可以使用 extends 語句,例如 4 泛型的引數型別可以使用 super ...

Java 泛型引數型別理解

1 泛型引數型別限制 1 泛型的引數型別只能是類 class 型別,而不能是簡單型別。2 可以宣告多個泛型引數型別,比如 同時還可以巢狀泛型,例如 3 泛型的引數 型別可以使用 extends 語句,例如。4 泛型的引數型別可以使用 super 語句,例如 t super childclass 5 ...