泛型的用法
阿新 • • 發佈:2019-02-17
泛型
泛型的使用場景:當一個類或一個方法需要處理多種型別的資料時,我們使用泛型來簡化操作
泛型在類上
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) ;