1. 程式人生 > >泛型的用法

泛型的用法

泛型

泛型的使用場景:當一個類或一個方法需要處理多種型別的資料時,我們使用泛型來簡化操作

泛型在類上

  • 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) ;