转载

Java中的泛型

通配符是什么

<?>

指的是Object及其子类,也就是所有Java对象

泛型是什么

  1. <E> :Element (容器中的元素,如集合)
  2. <T> :Type(Java 类)
  3. <K> :Key(键)
  4. <V> :Value(值)
  5. <N> :Number(数值类型)
  6. <S> 、< U><A><B> ….

声明泛型

<T>

声明一个泛型类或者泛型方法

示例:

public class ResultDTO<T>  implements Serializable{
    private static final long serialVersionUID = 801125677591974439L;
	private int code;
	private String msg;
    @JsonInclude(JsonInclude.Include.NON_DEFAULT)
	private Object data;
	
	private ResultDTO(ResultEnum stateEnum, Object data) {
		this.code = stateEnum.getCode();
		this.msg = stateEnum.getMsg();
		this.data = data;
	};
    //setter
    //getter
}

使用泛型

<?>

使用一个泛型类或者泛型方法

示例:

public static ResultDTO<?> entity(int code,Object... data) {
    ResultEnum resultEnum = ResultEnum.getEnum(code);
	if(0==data.length) {
		return new ResultDTO<ResultEnum>(resultEnum);
	}else{
		return new ResultDTO<Object>(resultEnum,data);
	}
}

通配符之边界

为什么通配符要加边界

为了解决容器中存储的元素不能是该基类( 父类 )的 子类

上界通配符

关键字: extends

禁止做插入操作,只做读取

最大只能是该 基类父类 )的 子类

public static ResultDTO<? extends Object> entity1(int code,Object... data) {
	ResultEnum resultEnum = ResultEnum.getEnum(code);
	if(0==data.length) {
			return new ResultDTO<ResultEnum>(resultEnum);
	}else{
			return new ResultDTO<Object>(resultEnum,data);
	}
}

下界通配符

关键字: super

最小只能是该 子类 ,不能是该类的 子类

无法确定存入类型,可以插入操作,而无法读取操作

Apple 继承 FruitFruit 继承 Food

public static ResultDTO<? super Fruit> entity(int code,Object... data) {
	ResultEnum resultEnum = ResultEnum.getEnum(code);
	if(0==data.length) {
		return new ResultDTO<Food>(resultEnum);
	}if(1==data.length) {
		return new ResultDTO<Fruit>(resultEnum);
	}else{
		return new ResultDTO<Apple>(resultEnum,data);//报错
	}
}

报错

Type mismatch: cannot convert from ResultDTO<Apple> to ResultDTO<? super Fruit>

PECS原则

Producer Extends Consumer Super原则

extends
super

<?>

参考文档

[List<?>和List 的区别?](https://www.zhihu.com/question/31429113) [Java 泛型 <? super T> 中 super 怎么 理解?与 extends 有何不同?](https://www.zhihu.com/question/20400700/answer/117464182)

原文  https://www.huangdayu.cn/2018/12/13/Java中的泛型/
正文到此结束
Loading...