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 Plant public 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(); } //方法定义的泛型F public <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{ @Override public 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>{ @Override public Class<QueryReq> getRequestBodyClass() { return QueryReq.class; } @Override public 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
相关推荐
"001_如何学习JAVA300集(一定要看…………).mp4"这个视频课程,很可能是对以上知识点的详细讲解,建议按照课程结构系统学习,同时结合实践项目巩固知识,以更好地应对互联网行业的竞争和挑战。在学习过程中,不断...
Java基本的程序设计结构 3.1 一个简单的Java应用程序 3.2 注释 3.3 数据类型 3.4 变量 3.5 运算符 3.6 字符串 3.7 输入输出 3.8 控制流程 3.9 大数值 3.10 数组 第4章 对象与类...
Java基本的程序设计结构 3.1 一个简单的Java应用程序 3.2 注释 3.3 数据类型 3.4 变量 3.5 运算符 3.6 字符串 3.7 输入输出 3.8 控制流程 3.9 大数值 3.10 数组 第4章 对象与类...
Java基本的程序设计结构 3.1 一个简单的Java应用程序 3.2 注释 3.3 数据类型 3.4 变量 3.5 运算符 3.6 字符串 3.7 输入输出 3.8 控制流程 3.9 大数值 3.10 数组 第4章 对象与类...
Java是Android开发的基础,理解其核心概念至关重要。这包括但不限于: 1. 面向对象编程:类、对象、继承、多态、封装。 2. 内存管理:垃圾回收机制,内存泄漏检测。 3. 异常处理:异常分类,如何妥善处理异常。 4. ...