泛型的用法

泛型

泛型的使用场景:当一个类或一个方法需要处理多种类型的数据时,我们使用泛型来简化操作

泛型在类上

  • 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) ;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值