目標:
-
我們在集合中會大量使用到泛型,這里來完整地學習泛型知識。泛型,用來靈活地將數據類型應用到不同的類、方法、接口當中。將數據類型作為參數進行傳遞。
步驟:
-
定義和使用含有泛型的類
-
定義和使用含有泛型的方法
-
講解:
定義和使用含有泛型的類
定義格式:
修飾符 class 類名<代表泛型的變量> { }
例如,API中的ArrayList集合:
泛型在定義的時候不具體,使用的時候才變得具體。在使用的時候確定泛型的具體數據類型。
class ArrayList<E>{
public boolean add(E e){ }
public E get(int index){ }
....
}
使用泛型: 即什么時候確定泛型。
在創建對象的時候確定泛型
例如,ArrayList<String> list = new ArrayList<String>();
此時,變量E的值就是String類型,那么我們的類型就可以理解為:
class ArrayList<String>{
public boolean add(String e){ }
public String get(int index){ }
...
}
再例如,ArrayList<Integer> list = new ArrayList<Integer>();
此時,變量E的值就是Integer類型,那么我們的類型就可以理解為:
class ArrayList<Integer> {
public boolean add(Integer e) { }
public Integer get(int index) { }
...
}
定義和使用含有泛型的方法【重點】
定義格式:
修飾符 <代表泛型的變量> 返回值類型 方法名(參數){ }
例如,
public class MyGenericMethod {
public <MVP> void show(MVP mvp) {
System.out.println(mvp.getClass());
}
public <MVP> MVP show2(MVP mvp) {
return mvp;
}
}
調用方法時,確定泛型的類型
public class GenericMethodDemo {
public static void main(String[] args) {
// 創建對象
MyGenericMethod mm = new MyGenericMethod();
// 演示看方法提示
mm.show("aaa");
mm.show(123);
mm.show(12.45);
}
}
定義和使用含有泛型的接口
定義格式:
修飾符 interface接口名<代表泛型的變量> { }
例如,
public interface MyGenericInterface<E>{
public abstract void add(E e);
public abstract E getE();
}
使用格式:
1、定義類時確定泛型的類型
例如
public class MyImp1 implements MyGenericInterface<String> {
此時,泛型E的值就是String類型。
2、始終不確定泛型的類型,直到創建對象時,確定泛型的類型
例如
public class MyImp2<E> implements MyGenericInterface<E> {
確定泛型:
/*
* 使用
*/
public class GenericInterface {
public static void main(String[] args) {
MyImp2<String> my = new MyImp2<String>();
my.add("aa");
}
}
小結:泛型是一種未知的數據類型,定義在類上的泛型,使用類的時候會確定泛型的類型,定義在方法上的泛型,會在使用方法的時候確定泛型,定義在接口上的泛型,需要使用接口的時候確定泛型。