java泛型--概念、使用、自定义……

来源:互联网 发布:百度云搜索源码 编辑:程序博客网 时间:2024/06/05 12:08

0,泛型不能有用于static的。

 

1,Class

Class<Boolean> clazz  等效于 Boolean.class;

Class<T> valueType 等效于 T.class

public void _testGeneric(Class<?>clazz)

等效于

public <B> void _testGeneric(Class<? extends B>clazz){

 

2,通配符

?只能用于方法泛型,不能用于类泛型。

 

3,泛型就是不确定类型

//泛型如果为确定类型时,就没必要存在了,就想这个警告://The type parameter Plant is hiding the type Plantpublic class Test2<Plant> {private Plant t;public Plant get(){return t;}}

 

 4,把子类使用的其他具体类型传给父类,让父类统一处理。

例子:class Apple extends Fruit extends Plant implements Living

public class PlantFSM<T extends Plant> {private T owner;public PlantFSM(){}public PlantFSM(T owner){this.owner = owner;}public T getOwner() {return owner;}public void setOwner(T owner) {this.owner = owner;}}

 

public class AppleFSM extends PlantFSM<Apple> {public AppleFSM(){}public AppleFSM(Apple owner) {super(owner);}public static void main(String[] args) {AppleFSM appleFSM = new AppleFSM();Apple apple = new Apple();//自动为Apple类型:com.generic.PlantFSM.setOwner(Apple owner)appleFSM.setOwner(apple);//自动为Apple类型:Apple com.generic.PlantFSM.getOwner()appleFSM.getOwner();}//方法定义的泛型Fpublic <F> F getF(){return null;}}

 反编译后

public class PlantFSM{    public PlantFSM(){}    public PlantFSM(Plant owner){        this.owner = owner;    }    public Plant getOwner(){        return owner;    }    public void setOwner(Plant owner){        this.owner = owner;    }    private Plant owner;}

 

public class AppleFSM extends PlantFSM{    public AppleFSM(){}    public AppleFSM(Apple owner){        super(owner);    }    public static void main(String args[]){        AppleFSM appleFSM = new AppleFSM();        Apple apple = new Apple();        appleFSM.setOwner(apple);        appleFSM.getOwner();    }    public Object getF(){        return null;    }}

 

5,

例子2

public interface IProcessor {public String process(String idipPacket);public int getReqCmdId();public int getRespCmdId();}

 

/** * <"B">与<"BODY">没任何区别,只是一个类型定义(占位符)。 * @author naijiang.wang */public abstract class AbstractProcessor<BODY> implements IProcessor{@Overridepublic String process(String json) {DataPacket<BODY> dataPacket = getDataPacket(json);response = response(dataPacket, serverId);Object response = null; try {dataPacket = getDataPacket(json);response = response(dataPacket, serverId);} catch (Exception e) {e.printStackTrace();}finally {if(response == null) {response = responseForResult(dataPacket.getHead(), ResultType.API_ERROR);}resp = JsonUtils.toJson(response);}return resp ;}//返回的泛型范围,可以大于真实具体的类型返回。比如:DataPacket.body是QueryReq类型。private DataPacket<BODY> getDataPacket(String json) {return JsonUtils.toBean(json, DataPacket.class, getRequestBodyClass());}public abstract Class<BODY> getRequestBodyClass();private DataPacket<?> response(DataPacket<BODY> dataPacket, Integer serverId) {DataPacket<?> response = process(dataPacket.getHead(), dataPacket.getBody(), serverId);return response;}//子类方法中body比如是:QueryReq类型。<?>表示不是BODY泛型public abstract DataPacket<?> process(DataHeader head, BODY body, Integer serverId);}

 

public class QueryProcessor extends AbstractProcessor<QueryReq>{@Overridepublic Class<QueryReq> getRequestBodyClass() {return QueryReq.class;}@Overridepublic DataPacket<?> process(DataHeader head, QueryReq body, Integer serverId) {QueryResp queryResp = new QueryResp();//填充数据return new DataPacket<QueryResp>(head, queryResp);}}

 

http://www.infoq.com/cn/articles/cf-java-generics

原创粉丝点击