泛型有三种使用方式,分别为:泛型类、泛型接口、泛型方法
泛型类:
泛型类型用于类的定义中,被称为泛型类。通过泛型可以完成对一组类的操作对外开放相同的接口;
如下是自定义泛型类:
//此处T可以随便写为任意标识,常见的如T、E、K、V等形式的参数常用于表示泛型 //在实例化泛型类时,必须指定T的具体类型 public class ResObject<T> implements Serializable { private String errCode; private String errDesc;; //object这个成员变量的类型为T,T的类型由外部指定 private T object; public T getObject() { //泛型方法getKey的返回值类型为T,T的类型由外部指定 return object; } public ResObject( @SuppressWarnings("rawtypes") ReqObject req, Exception e ){ }
public void setObject(T object) { //泛型构造方法形参key的类型也为T,T的类型由外部指定this.object = object;}
泛型类的使用,下面是控制层中的一个例子:
如果有一个Product实体类
public ResObject<Product> create(@RequestBody ReqObject<Product> data) {
try {
return null;
} catch (Exception e) {
return new ResObject<Product>(data, e);
}
}
泛型通配符“?”:
应用场景:在使用泛型类型作为实参引用类型时使用,注意是用做实参!实参!
如下demo
package cn.lz.life.util;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import cn.lz.cloud.common.service.ReqObject;
import cn.lz.life.model.productmanage.Image;
import cn.lz.life.model.productmanage.Product;
public class Test {
private static final Logger log = LoggerFactory.getLogger(Test.class);
public static void main(String[] args) {
//实例化一个Image类
Image image = new Image();
image.setUuid("123");
image.setPath("123");
demo(new ReqObject<Image>(image));
//实例化一个Product类
Product product = new Product();
product.setProductCode("123");
product.setProductName("123");
demo(new ReqObject<Product>(product));
}
private static void demo(ReqObject<?> data) {//?做实参泛型占位符
System.out.println(data.getObject());
}
}
控制台打印:
Image [uuid=123, path=123, MD5Code=null, base64Code=null]
Product [productCode=123, productName=123, productProperty=null, model=null, unit=null, specification=null, type=null, purchasePrice=null, salePrice=null, images=null]