泛型继承的原则
继承泛型类时,必须对父类中的类型参数进行初始化。
步骤:
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());