泛型繼承的原則
繼承泛型類時,必須對父類中的類型參數進行初始化。
步驟:
1、定義一個泛型類Parent
<T>
,
注意:定義:泛型T,使用:實際類型
2、子類繼承調用。Son
類定義時有兩種方式初始化父類型的類型參數:
- 法1:用子類中的泛型類型初始化父類:
public class Son<T> extends Parent<T>{}
- 法2:用具體類型初始化:
public class Son extends Parent<String>{}
方法1比較常見,對方法2用法的理解,可以參考以下代碼:
使用HomeFragment時,調用new HomeFragment即可,因爲HomeFragment繼承了BaseListFragment<HomeViewModel> 時已經用具體類型 HomeViewModel 初始化了 BaseListFragment<T extends AbsViewModel> 中的T.
定義BaseListFragment代碼如下,可以看到尖括號內用了<T>
關於ArrayList<E>的理解
E — Element
以下代碼:
ArrayList<String> = new ArrayList<String>();
ArrayList<Integer> = new ArrayList<Integer>();
MutableLiveData<String> loadState = new MutableLiveData<>(); ----LiveData框架類
protected void postState(String state) {
if (loadState != null) {
loadState.postValue(state);
}
}
可以參考下面示例理解:
//定義
class Point<T> {// 此處可以隨便寫標識符號
private T x ;
private T y ;
public void setX(T x) {//作爲參數
this.x = x ;
}
public void setY(T y) {
this.y = y ;
}
public T getX() {//作爲返回值
return this.x ;
}
public T getY() {
return this.y ;
}
};
//IntegerPoint使用
Point<Integer> p = new Point<Integer>() ;
p.setX(new Integer(100)) ;
System.out.println(p.getX());
//FloatPoint使用
Point<Float> p = new Point<Float>() ;
p.setX(new Float(100.12f)) ;
System.out.println(p.getX());