JAVA基础课程
第二十一天 泛型
为什么要有泛型
①泛型设计的背景
泛型既标签的意思~
集合容器在设计阶段/声明阶段不能确定这个容器到底实际存的是声明类型的对象,所以在JDK1.5之前元素都设计为Object,JDK1.5之后使用泛型来解决。因为这个时候除了元素的类型不确定。其他的部分都是确定的,例如关于这个元素如何保存,如何管理,因此此时把元素的类型设计成一个参数,这个类型参数叫做泛型。
②何为泛型?
所谓泛型,就是允许在定义类、接口时通过一个标识类中某个属性的类型或者是某个方法的返回值及参数类型。这个类型参数在使用时确定。
③在集合中使用泛型
(1)集合接口或集合类在jdk5.0时都修改为带泛型的结构
(2)在实例化接口类时,可以指明具体的泛型类型
(3)指明完以后,在集合类或者接口中凡时定义类或接口时,内部结构使用到泛型的位置,都指定为实例化的泛型类型
(4)泛型类型必须时类,不能时基本数据类型,基本数据类型用包装类
(5)如果实例化时,没有指明泛型的类型,/默认为Object。

④泛型基本使用
@Test
public void test(){
/***
* 没有泛型的使用
*/
List list1 = new ArrayList();
list1.add(123);
list1.add("234");
Iterator iterator1 = list1.iterator();
while (iterator1.hasNext()){
System.out.println(iterator1.next());
}
/***
* 使用泛型
*/
List<String> list = new ArrayList<>();
list.add("123");
list.add("234");
Iterator<String> iterator = list.iterator();
while (iterator.hasNext()){
String next = iterator.next();
System.out.println(next);
}
}
自定义泛型
(1)泛型类可能有多个参数,此时应该将多个参数一起放在尖括号内。
(2)实例化后,操作原来的泛型位置的结构必须与指定泛型类型一致
(3)泛型不同的应用不能相互赋值
(4)泛型如果不指定,将被擦除,泛型对象的类型都按照Object处理,但不等价于Object。
(5)如果泛型时一个接口,或者抽象类,则不可以创建泛型类对象
(6)父类有泛型,子类可以选择保留泛型也可以选择指定泛型类型——》子类除了可以指定或者保留父类的泛型,还可以增加自己的泛型。
(7)异常类不能指定为泛型
package com.test.course.generictest;
import java.util.ArrayList;
import java.util.List;
/**
* 〈泛型类〉
*
* @author PitterWang
* @create 2020/5/11
* @since 1.0.0
*/
public class GenericClass<E> {
E item;
public GenericClass(){
}
public void setItem(E e){
this.item = e;
}
public E getItem() {
return item;
}
/***
* 泛型方法
* @param e
* @param <E>
*/
public <E> void printItem(E e){
System.out.println(e);
}
/***
* 泛型方法:在方法中国出现了泛型的结构,泛型的参数与类的泛型参数没有任何关系
* 泛型方法所属的类是不是泛型类都没有关系
* @param arr
* @param <E>
* @return
*/
public <E> List<E> copyArray(E[] arr){
ArrayList<E> list = new ArrayList<E>();
for (E e : arr) {
list.add(e);
}
return list;
}
}
通配符
(1)通配符:<?>,允许所有泛型的引用调用
(2)通配符指定上限:
上限extends:使用时指定的类型必须时继承某个类,或者实现某个接口,既: <=
(3)通配符指定下限:
下限super:使用时指定的类型不能小于操作的类,既:>=
例子:
<? extends Number> 只允许泛型为Number及Number子类的引用调用
<? super Number> 只允许泛型为Number及Number父类的引用调用