泛型
泛型的使用场景:当一个类或一个方法需要处理多种类型的数据时,我们使用泛型来简化操作
泛型在类上
T叫做类型变量,<> 表示引入类型变量
无论是泛型类还是泛型方法,都是需要先<>引入类型变量,然后才可以使用该泛型
当调用泛型类或泛型方法时,也需要使用<>传入类型参数,如
String str = ArrayAlg.<String>getMiddle("jone","jack","micheal");
(其中getMiddle()前面的<String>
表示传入类型参数String )
public class Pair<T> {
private T mFirst ;
public Pair(T first){
this.mFirst = first ;
}
public T getFirst(){
return this.mFirst ;
}
}
使用:
Pair<String> pair= new Pair<String>("good") ;
//getFirst()将是返回String类型
String result = pair.getFirst() ;
泛型在方法上
class ArrayAlg{
public static <T> T getMiddle(T[] a){
return a[a.length / 2] ;
}
}
泛型方法的使用:
//注意调用泛型方法getMiddle()时,前面是加了泛型了
String str = ArrayAlg.<String>getMiddle("jone","jack","micheal");
//可以简化成这样,虚拟机可自动判断类型,但是感觉还是要加上类型参数的好
//String str = ArrayAlg.getMiddle("jone","jack","micheal")
后续补充
我觉得的比较好的泛型运用的代码(1)
public class MapAsyncTaskUtils {
public static class LoadTaskMarkTask extends AsyncTask<Void,Void,ApiResponse<List<MarkerEntity>>>{
private String mAlarm ;
private String mTaskId ;
private String mToken ;
private MarkerCallBack<List<MarkerEntity>> mCallBack;
private MarkerAndRecordApi mMarkerApi;
/**
* @param alarm 警号
* @param taskid 任务id
* @param token token
* @param callBack 回调
*/
public LoadTaskMarkTask(String alarm,String taskid ,String token,MarkerCallBack<List<MarkerEntity>> callBack) {
this.mAlarm = alarm ;
this.mTaskId = taskid ;
this.mToken = token;
this.mCallBack = callBack;
mMarkerApi = new MarkerAndRecordApiImpl() ;
}
@Override
protected ApiResponse<List<MarkerEntity>> doInBackground(Void... params) {
if (isCancelled()) {
return null;
}
return mMarkerApi.requestTaskMarkers(mAlarm,mTaskId,mToken) ;
}
@Override
protected void onPostExecute(ApiResponse<List<MarkerEntity>> apiResponse) {
if (isCancelled()) {
return;
}
if (apiResponse != null && apiResponse.isSuccess()) {
mCallBack.onSuccess(apiResponse.getResponse());
} else {
mCallBack.onFail(new Exception());
}
}
}
/*泛型接口*/
public interface MarkerCallBack<T> {
void onSuccess(T data);
void onFail(Exception e);
}
}
使用:
mLoadTaskMarkTask = new MapAsyncTaskUtils.LoadTaskMarkTask(alarm,taskid,token,new MapAsyncTaskUtils.MarkerCallBack<List<MarkerEntity>>(){
@Override
public void onSuccess(List<MarkerEntity> data) {
if (data != null && data.size() > 0){
mData.clear();
mData.addAll(data) ;
//TODO 更新适配器
//......
}else {
ToastUtils.showToast(context,"标记数据为空");
}
}
@Override
public void onFail(Exception e) {
ToastUtils.showToast(context,"请求标记数据失败");
}
});
mLoadTaskMarkTask.execute() ;
// mLoadTaskMarkTask.cancel(true) ;