把类型明确的工作推迟到创建对象或调用方法的时候才去明确的特殊的类型
泛型类
public class ObjectTool<T> {
private T obj;
public T getObj() {
return obj;
}
public void setObj(T obj) {
this.obj = obj;
}
}
泛型方法
public static void main(String[] args) {
Main main = new Main();
main.show("haha");
main.show(123);
}
//定义泛型方法..
public <T> void show(T t) {
System.out.println(t);
}
类型通配符
该test()方法只能遍历装载着Object的集合
泛型中的<Object>并不是像以前那样有继承关系的,也就是说List<Object>和List<String>是毫无关系的
所以代码应该改成这样:<?> 表示未知类型
public void test(List<?> list){
}
通配符上限
可以看到,即使 Apple 是继承 Furits 的,但是赋值还是报错
使用类型通配符,错误消失
List<? extends Fruits> fruitsList = appleList;
这种形式表明:这个一个 Fruits 或它的子类
但我们不能直接想 fruitsList 中添加 apple 实例,因为,fruitsList 代表的不仅仅是 apple,也可能为 banana
装载的元素只能是Fruits的子类或自身,应用于提取数据的集合,如生成器(Producer)
所以 <? extends Fruits> 可以理解为只能读不能写
通配符下限
装载的元素只能是Fruits的父类或自身,应用于填充元素的集合,如消费者(Consumer)
可以写
PECS
Producer Extends Consumer Super
extends 范围缩小,不能塞数据,只能提取数据,生成器(produer)
super 范围扩大,可以添加元素,消费者(Conusmer)
参考
泛型就这么简单
深入理解 Java 核心技术 张洪亮