接上文java泛型
在上文中我們使類別class GenDemo<T>
,持有者T的範圍沒有限制,實際上相當於Object.
但是我們有時需要傳入的參數類型為某個介面或類別的實作或子類,而不是沒有限制的Ojbect
所以使用限制泛型。再次我們讓T為藉口Collection的實作:
import java.util.collection;public class GenDemo<T extends Collection> { private T t; public GenDemo(T t) { this.t = t; } public void setT(T t) { this.t = t; } public T getT(){ return T; } }
class GenDemo<T extends Collection>
使用限制泛型,決定了持有者T的型別只能是Collection的實作類,如果傳入的是非Collection類,譯時就會報錯。
注意:<T extends Collection>
使用了關鍵字extends, 但是extends 後面也可以使用接口,也可以使用類, 此處的extends 並不是繼承,這裡應該理解為T的型別是實作xx介面的實作類,或是繼承xx類的子類。
這裡的例子只示範了泛型方法的型別限定,對於泛型類別中型別參數的限制用完全一樣的規則,只是加在類別宣告的頭部,如:
public class Demo<T extends Comparable & Serializable> { // T类型就可以用Comparable声明的方法和Seriablizable所拥有的特性了}
主要使用extends關鍵字, 此處的extends統一了原有的extends和implements的概念, 即實作介面和繼承類別都使用extends,但是,仍然遵循應用的體系,java只能繼承一個類, 可以實作多個介面。也就是:
<T extends SomeClass & interface1 & interface2 & interface3>
接上文java泛型
在上文中我們使類class GenDemo<T>
,持有者T的範圍沒有限制, 實際上相當於Object.
但是我們有時需要傳入的參數類型為某個介面或類別的實作或子類,而不是沒有限制的Ojbect
所以使用限制泛型。再次我們讓T為藉口Collection的實作:
import java.util.collection;public class GenDemo<T extends Collection> { private T t; public GenDemo(T t) { this.t = t; } public void setT(T t) { this.t = t; } public T getT(){ return T; } }
class GenDemo<T extends Collection>
使用限制泛型,決定了持有者T的型別只能是Collection的實作類,如果傳入的是非Collection類,譯時就會報錯。
注意:<T extends Collection>
使用了關鍵字extends, 但是extends 後面也可以使用接口,也可以使用類, 此處的extends 並不是繼承,這裡應該理解為T的型別是實作xx介面的實作類,或是繼承xx類的子類。
這裡的例子只示範了泛型方法的型別限定,對於泛型類別中型別參數的限制用完全一樣的規則,只是加在類別宣告的頭部,如:
public class Demo<T extends Comparable & Serializable> { // T类型就可以用Comparable声明的方法和Seriablizable所拥有的特性了}
主要使用extends關鍵字, 此處的extends統一了原有的extends和implements的概念, 即實作介面和繼承類別都使用extends,但是,仍然遵循應用的體系,java只能繼承一個類, 可以實作多個介面。也就是:
<T extends SomeClass & interface1 & interface2 & interface3>
以上就是java之泛型深入的內容,更多相關內容請關注PHP中文網(www.php.cn)!