泛型概念
- 泛型即类型参数化(generic:通用的,一般的),JDK5引入
- 引入之前,类型必须是具体的。比如Integer,Number,String
- 引入之后,可以当做一个参数传进来,即类型参数化。比如 List#add(E e)
- 优势:
- 提高通用性。比如: 二分法排序 List#sort(Comparator<? super E> c), 可以用于任意类型
- 提高可读性,不用强转类型
泛型方法
类型参数声明:用<>包围,支持多个参数,参数间用逗号隔开
public <REQ extends BaseRequest<RESP>, RESP extends BaseResponse> Result<RESP> handle(REQ baseRequest){}
public <F, T> List<T> convert(List<F> list, Function<F, T> mapper>{}
泛型类
类型参数声明和 泛型方法一样。类中声明过的参数,方法就就不用<>声明了
public class HashMap<K,V> extends AbstractMap<K,V>{
public V put(K key, V value) {}
}
通配符(泛型边界)
泛型: 对元素的约束
泛型边界:“对元素的约束”的集合
//List<Integer>不是List<Number>的子类。
//上界通配符(Upper Bounds Wildcards)
public TreeSet(Collection<? extends E> c)
//下界通配符(Lower Bounds Wildcards)
public TreeSet(Comparator<? super E> comparator)