java 泛型 父子_java 泛型的使用

参考文档

http://www.cnblogs.com/panjun-Donet/archive/2008/09/27/1300609.html

泛型的主要目标是提高 Java 程序的类型安全。通过知道使用泛型定义的变量的类型限制,编译器可以在一个高得多的程度上验证类型假设。

可以查看下 Map, List , Future  等这些java 底层基础代码的写法,一目了然

下面举个我应用中碰到的例子以及写法,之所以举这个例子,主要是因为它包含了多种情况,1 参数是范型,2 返回值是范型,3,参数和返回值都是范型

app 产品中最不能缺的就是 push, 但是 ios 的推送 和 android 的推送还不一样,而且 android 推送还因为不同的第三方平台又不一样,比如小米推送,友盟推送,极光推送,百度云推送,个推推送等等

所以总思路是写一个通用接口,以及一个抽象类(主要是实现发送push),因为发送push的流程都是一样的,见下面的代码

接口

package com.zyguo.tools.push;public interfaceIPush{/**

* 异步发送PUSH*/

publicboolean sendPushByAsyn( PushBody pushBody );/**

* 同步发送PUSH

* @return 返回错误提示文案,若为 success, 说明发送成功*/

public String sendPushBySync( PushBody pushBody, intmaxWaitSec );

}

抽象类,因为不同的push通道,发送的消息格式是不一样的,而且返回值的格式也是不一样的(有json, xml ,byte 等等),所以定义了2个范型 M 代表消息,R代表返回值,privateString sendPush(PushBody pushBody) {} 就是发送push的通用流程

package com.zyguo.tools.push;

import java.util.concurrent.Callable;

import java.util.concurrent.ExecutionException;

import java.util.concurrent.Future;

import java.util.concurrent.TimeUnit;

import java.util.concurrent.TimeoutException;

import org.apache.log4j.Logger;

import com.zyguo.sdk.thread.BLThreadPool;

import com.zyguo.sdk.utils.BUtils;public abstract class AbstractPushimplements IPush {protected Logger log = Logger.getLogger( this.getClass().getName() );public final static String SUCCESS = "success";private BLThreadPool threadPool = newBLThreadPool();privateString sendPush(PushBody pushBody) {try{if ( pushBody != null &&BUtils.isNotBlank( pushBody.getToken() ) ) {long begin =System.currentTimeMillis();

log.debug("begin send push:" +pushBody );

M msg=pushBody2message( pushBody );

R response=sendPush( msg, pushBody.getToken() );long end =System.currentTimeMillis();

log.debug("end push,result==" + response + ",耗时:" + ( end - begin ) + "毫秒");if ( response != null) {

String result=dealPushResponse( response, pushBody );

log.debug("send xiaomi push suceess," +pushBody );returnresult;

}else{

log.error("no_response," +pushBody);return "no_response";

}

}else{return "token is null";

}

}catch(Exception e) {

log.error("send xiaomi push exception", e);return "exception:" +e.getMessage();

}

}protected abstractString dealPushResponse( R response, PushBody pushBody );protected abstractM pushBody2message( PushBody pushBody );protected abstractR sendPush( M msg, String token );

@Overridepublicboolean sendPushByAsyn( final PushBody pushBody) {

threadPool.submit(newRunnable() {public voidrun() {

sendPush( pushBody );

}

});return true;

}

@Overridepublic String sendPushBySync( final PushBody pushBody, intmaxWaitSec ) {

Future future = threadPool.submit( new Callable() {publicString call() throws Exception {returnsendPush( pushBody );

}

});try{

String result= future.get( maxWaitSec, TimeUnit.SECONDS );returnresult;

}catch(InterruptedException e) {

e.printStackTrace();

}catch(ExecutionException e) {

e.printStackTrace();

}catch(TimeoutException e) {

e.printStackTrace();

}return null;

}public voidsetThreadPool(BLThreadPool threadPool) {this.threadPool =threadPool;

}

}

小米 push 如下, 具体实现就不写出了

package com.zyguo.tools.push;

import java.io.IOException;

import org.json.simple.parser.ParseException;

import com.xiaomi.push.sdk.ErrorCode;

import com.xiaomi.xmpush.server.Constants;

import com.xiaomi.xmpush.server.Message;

import com.xiaomi.xmpush.server.Message.Builder;

import com.xiaomi.xmpush.server.Result;

import com.xiaomi.xmpush.server.Sender;public class XiaoMiPush extends AbstractPush{privateString appKey;privateString packageName;

@OverrideprotectedMessage pushBody2message( PushBody pushBody ){returnnull;

}@OverrideprotectedString dealPushResponse( Result response, PushBody pushBody ) {returnSUCCESS;}

@OverrideprotectedResult sendPush(Message msg, String token) {return null;

}public voidsetAppKey(String appKey) {this.appKey =appKey;

}public voidsetPackageName(String packageName) {this.packageName =packageName;

}

}

iOS push 如下

package com.zyguo.tools.push;

import com.xiaomi.push.sdk.ErrorCode;

import com.xiaomi.xmpush.server.Constants;

import com.xiaomi.xmpush.server.Message;

import com.xiaomi.xmpush.server.Result;

import com.xiaomi.xmpush.server.Sender;

import com.zyguo.sdk.utils.BUtils;public class IOSPush extends AbstractPush{@OverrideprotectedString dealPushResponse(Object response, PushBody pushBody) {return null;

}

@OverrideprotectedPayload pushBody2message(PushBody pushBody) {return null;

}

@Overrideprotectedboolean sendPush(Payload msg, String token) {return null;

}}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值