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