什麼是泛型
泛型的本質是參數化類型,也就是說所操作的 數據類型 被指定爲一個參數
泛型有什麼優勢
泛型完成的功能,Object類型也能完成,但是使用泛型可以更加方便,如泛型不需要類型轉換、泛型在編譯期間就能發現類型異常等
類型通配符
- 使用?代替具體的類型參數
- 通過super或extends來限定通配符範圍
List<? extends T>和List <? super T>之間有什麼區別 ?
考察的是 限定通配符 與 非限定通配符 的問題;
其兩者都是限定通配符,List<? extends T> 可以接受任何繼承自T類型的元素,而 List<? super T> 可以接受任何T的父類元素。例如List<? extends Number>可以接受List或List;
非限定通配符用 < ? > 表示,可以用任意類型來替代。
泛型類、泛型接口、泛型方法簡單用例
泛型類
/**
* @Author Snail
* @Describe 泛型的測試用例
* @CreateTime 2019/11/28
*/
public class GenericTest<T> {
private T t;
public GenericTest(T t) {
this.t = t;
}
public void showType() {
System.out.println("T的實際類型是:" + t.getClass().getName());
}
public static void main(String[] args) {
GenericTest<Integer> gen = new GenericTest(1);
gen.showType();//T的實際類型是:java.lang.Integer
System.out.println(" ====================== ");
//定義泛型類Generic的一個String的版本
GenericTest<String> strObj = new GenericTest("Hello Gen!");
strObj.showType();//T的實際類型是:java.lang.String
}
}
在上面的例子中,沒有限制 T 的範圍,T 可以是任意的類型。
如果需要限制 T 類型,其 T 符合單繼承多實現(繼承的類在前,實現的接口在後)的規則,寫法如下:
public class GenericTest<T extends Number & Serializable > {
//表達的意思:限制 T 必須是類 Number 和接口 Serializable 的共同子類
...
}
泛型接口
/**
* @Author Snail
* @Describe 泛型接口測試
* @CreateTime 2019/11/29
*/
public class GenericInterfaceTest implements GenericInterface<String>{
@Override
public String get() {
return "string";
}
public static void main(String[] args) {
GenericInterfaceTest genericInterfaceTest = new GenericInterfaceTest();
System.out.println(genericInterfaceTest.get());
}
}
interface GenericInterface<T>{
public T get();
}
泛型方法
泛型方法在調用時可以接收不同類型的參數,在方法內部可以根據不同的類型做出不同的處理。
/**
* @Author Snail
* @Describe 泛型方法測試用例
* @CreateTime 2019/11/29
*/
public class GenericMethodTest {
//泛型方法
//1.所有泛型方法聲明都有一個類型參數聲明部分(由尖括號分隔),該類型參數聲明部分在方法返回類型之前(在下面例子中的<E>)。
static <E> void print(E[] arr){
for(E e:arr){
System.out.println(e);
}
System.out.println();
}
public static void main(String[] args) {
print(new Integer[]{1,2,33,44});
print(new String[]{"a","bb","ccc"});
}
}