泛型之泛型類
泛型類
public class A<T> { //在成員變數上使用泛型 private T t; public A() {} //構造引數型別上使用泛型 public A(T t) { this.t = t; } //方法返回值上使用泛型 public T getT() { return t; } //方法的引數上使用泛型 //這是泛型類的方法,而不是泛型方法 public void setT(T t) { this.t = t; } //方法的返回值和引數型別上使用泛型 public T foo(T t) { return t; } public void foo2() { //T t = ....; //區域性變數的引用型別上使用泛型 //new T(); //不可以這樣使用 } public void foo3() { //在建立泛型類物件時,即為型別變數賦值,這裡將T賦值為String型別 A<String> a = new A<String>(); //將T賦值為Integer型別 A<Integer> a1 = new A<Integer>(); } }
A是一個泛型類,T它是一個變數,需要賦型別值,如果有多個型別變數,就用逗號分隔,比如 Jdk 的 Map 介面:interface Map<K,V> {}
。
定義:具有一個或多個型別變數的類,稱之為泛型類 。
泛型類是一個存在型別變數的類,存在可變的因素,所以說是一個不完整的類。那麼當子類去繼承的時候,把裡面的型別變數賦予了型別,那麼這個類就完整了,就可以使用了。
泛型類的繼承
public class B<T> {} class BB extends B<String> {}
建立BB物件的兩種方式
B<String> b = new BB() BB b = new BB()
錯誤方式
-
BB<String> bb = new BB<String>()
錯誤原因:BB 繼承了泛型類 B,但 BB 並不是泛型類,所以不能這樣建立物件。
public class C<T> {} class CC<E> extends C<E> {} class CCC<E> extends C<Integer> {}
建立CC物件
C<String> c = new CC<String>() C<Integer> c = new CC<Integer>()
泛型引用和建立,兩端給出的泛型變數必須相同(等號前後的泛型型別應該保持一致),否則會報錯。
CC是泛型類,它的父類也泛型類,它可以給父類傳遞型別常量,也可以傳遞變數,這裡傳遞的是變數。
CCC同樣是泛型類,它的父類也是泛型類,它傳遞的是常量。
泛型類的子類重寫父類方法
public class D<T> { private T bean; public void setBean(T bean) { this.bean = bean; } } class DD<E> extends D<E> { /** * 子類重寫父類方法,引數型別必須是E,因為子類在定義 * 已經把型別E賦給了父類。 */ @Override public void setBean(E o) { //TODO } } class DDD<E> extends D<String> { //子類定義時已經把型別String賦給了父類,所以方法重寫時型別是String public void setBean(String str) { //TODO } }