文章目录
泛型
泛型是JDK5中引入的特性,它提供了编译时类型安全检测机制
1.泛型的好处
- 统一数据类型。
- 把运行时期的问题提前到了编译期间,避免了强制类型转换可能出现的异常,因为在编译阶段类型就能确定下来
2.泛型的细节
- 泛型中不能写基本数据类型'
- 指定泛型的具体类型后,传递数据时,可以传入该类类型或者其子类类型
- 如果不写泛型,类型默认是Object
3.泛型类
使用场景
当一个类中,某个变量的数据类型不确定时,就可以定义带有泛型的类
格式
修饰符 class 类名<类型>{}
举例:
public class ArrayList < E > {
创建该类对象时,E就确定类型}
代码示例
构建泛型类
java
//当我在编写一个类的时候,如果不确定类型,那么这个类就可以定义为泛型类。
public class MyArrayList<E> {
Object[] obj = new Object[10];
int size;
// E : 表示是不确定的类型。该类型在类名后面已经定义过了。
// e:形参的名字,变量名
public boolean add(E e){
obj[size] = e;
size++;
return true;
}
public E get(int index){
return (E)obj[index];
}
@Override
public String toString() {
return Arrays.toString(obj);
}
}
使用泛型类
java
public static void main(String[] args) {
//String类型
MyArrayList<String> list = new MyArrayList<>();
list.add("aaa");
list.add("bbb");
list.add("ccc");
System.out.println(list);
//Integer类型
MyArrayList<Integer> list2 = new MyArrayList<>();
list2.add(123);
list2.add(456);
list2.add(789);
int i = list2.get(0);
System.out.println(i);
System.out.println(list2);
}
4.泛型方法
使用场景
方法中形参类型不确定时:
方案①:使用类名后面定义的泛型
方案②:在方法申明上定义自己的泛型
格式
修饰符 <类型>返回值类型 方法名(类型 变量名){}
举例:
public <T> void show (T t){}
代码示例
定义一个工具类:ListUtil
类中定义一个静态方法addAll,用来添加多个集合的元素。
java
package a04mygenerics;
import java.util.ArrayList;
public class ListUtil {
private ListUtil(){}
//类中定义一个静态方法addAll,用来添加多个集合的元素。
/*
* 参数一:集合
* 参数二~最后:要添加的元素
*
* */
public static<E> void addAll(ArrayList<E> list, E e1,E e2,E e3,E e4){
list.add(e1);
list.add(e2);
list.add(e3);
list.add(e4);
}
/* public static<E> void addAll2(ArrayList<E> list, E...e){
for (E element : e) {
list.add(element);
}
}*/
public void show(){
System.out.println("尼古拉斯·纯情·天真·暖男·阿玮");
}
}
java
public static void main(String[] args) {
ArrayList<String> list1 = new ArrayList<>();
ListUtil.addAll(list1, "aaa", "bbb", "ccc", "ddd");
System.out.println(list1);
ArrayList<Integer> list2 = new ArrayList<>();
ListUtil.addAll(list2,1,2,3,4);
System.out.println(list2);
}
5.泛型接口
在接口名后面定义泛型,实现类确定类型,实现类延续泛型
修饰符 interface 接囗名<类型>{}
public interface List< E >{}
如何使用它:
1.实现类给出具体的类型
2.实现类延续泛型,创建实现类对象时再确定类型
6.泛型的继承
泛型不具备继承性,但是数据具备继承性
java
package a04mygenerics;
import java.util.ArrayList;
public class GenericsDemo5 {
public static void main(String[] args) {
//创建集合的对象
ArrayList<Ye> list1 = new ArrayList<>();
ArrayList<Fu> list2 = new ArrayList<>();
ArrayList<Zi> list3 = new ArrayList<>();
//调用method方法
method(list1);
method(list2);//报错,泛型不具备继承性
method(list3);//报错,泛型不具备继承性
list1.add(new Ye());
list1.add(new Fu());//可以添加成功,数据具备继承性
list1.add(new Zi());//可以添加成功,数据具备继承性
}
/*
* 此时,泛型里面写的是什么类型,那么只能传递什么类型的数据。
* */
public static void method(ArrayList<Ye> list) {
}
}
7.泛型的通配符
此时,泛型里面写的是什么类型,那么只能传递什么类型的数据。弊端:
利用泛型方法有一个小弊端,此时他可以接受任意的数据类型
Ye Fu zi Student
希望:本方法虽然不确定类型,但是以后我希望只能传递Ye Fu zi,此时我们就可以使用泛型的通配符
通配符
?
也表示不确定的类型,他可以进行类型的限定
? extends E
:表示可以传递E或者E所有的子类类型
? super E
:表示可以传递E或者E所有的父类类型
使用场景
定义类、方法、接口的时候,如果类型不确定,就可以定义泛型
如果类型不确定,但是能知道是哪个继承体系中的,可以使用泛型的通配符
通配符关键点:可以限定类型的范围。