在学习Java中,最常见的就是泛型,几乎所有容器类都会使用泛型,自己封装的方法也会使用泛型;最大的感受就是通过泛型的使用,大大的扩展了代码的可扩展性。降低了代码的耦合度,所以泛型是Java基础的一个重要特性,抽时间还是要好好复习以下;
1.基本概念
声明具有一个或多个参数类型的类或接口;编译器约束,运行期自动擦除;
泛型的优势:参数化类型,类型安全性和表述性;
2.泛型与数组对比
泛型用的最多的情况是在容器类中,例如我们所熟悉的List,ArrayList,LinkedList,HashMap,HashSet,LinkedHashMap.ConcurrentHashMap等容器类中。那么这些容器类和对象数组之间存在什么区别呢?
最主要的不同有两点:1.泛型是不可变的;数组是协变的。2.泛型运行期的擦除,数组运行期具体化;
协变可以理解为面向对象的多态,父类型可以指向子类型。编译过程中并不会校验;泛型的不可变在于,指定的是A类型,A的子类型也不能通过编译;
Object[] l = new Long[10];
l[0]="1111";//编译不报错
List<Object> list = new ArrayList<Long>();//编译报错
3.泛型方法
1.有限制性通配符
两种类型PECS(producter-extends,consumer-super),<? extends E>和<? super E>两种类型;
只根据这个名词理解真的是有点难,其实直白点<? extends E>表示接收的参数继承了E,也即是只能是E或E的子类;<? super E>表示E所继承的超类;
2.泛型补偿
参考图书:《effective java》