目录
泛型概述
泛型:是JDK5中引入的特性,可以在编译阶段约束操作的数据类型,并进行检查。
泛型的格式:<数据类型>
注意:泛型只能支持引用数据类型;
import java.util.ArrayList;
import java.util.Iterator;
public class GenericsDemo1 {
public static void main(String[] args) {
//1.创建集合的对象
//如果我们没有给集合指定类型,默认为所有的数据类型都是Object类型;
//此时推出了泛型;
ArrayList<String> list=new ArrayList();
//2.添加数据
//list.add(123);
list.add("aaa");
//list.add(new Student("zhangsan",123));
//3.遍历集合获取里面的每一个元素;
Iterator<String> it=list.iterator();
while(it.hasNext()){
String str=(String)it.next();
str.length();
System.out.println(str);
}
}
}
泛型的好处
- 统一数据类型
- 把运行时期的问题提前到了编译期间,避免了强制类型转换可能出现的异常,因为在编译阶段类型就能确定下来;
泛型的细节:
- 泛型中不能写基本数据类型;
- 指定泛型的具体类型后,传递数据时,可以传入该类类型或者其子类类型;
- 如果不写泛型,类型默认是Object;
泛型类:
使用场景:当一个类中,某个变量的数据类型不确定时,就可以定义带有泛型的类;
import java.util.Arrays;
public class MyArrayList<E> {
//E:表示不确定的类型,该类型在类名后面已经定义过了;
//e:形参的名字,变量名;
Object[] obj=new Object[10];
int size;
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);
}
}
public class GenericsDemo2 {
public static void main(String[] args) {
MyArrayList<String> list=new MyArrayList<>();
//list.add("aaa");
//list.add("bbb");
//System.out.println(list);
//[aaa, bbb, null, null, null, null, null, null, null, null]
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);
}
}
泛型方法
方法中形参的类型不确定时,可以使用类名后面定义的泛型<E>,表示不确定的类型;
方法中形参类型不确定时:
- 使用类名后面定义的泛型;
- 在方法申明定义自己的泛型;
格式:
修饰符<类型>返回值类型 方法名(类型 变量名){
}
import java.util.ArrayList;
public class ListUtil {
private ListUtil(){}
//1.定义一个静态方法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 void show(){
System.out.println("小仙女");
}
}
import java.util.ArrayList;
public class GenericsDemo3 {
public static void main(String[] args) {
//测试类
ArrayList<String> list=new ArrayList<>();
ListUtil.addAll(list,"aaa","bbb","ccc","ddd");
System.out.println(list);
//[aaa, bbb, ccc, ddd]
}
}
泛型接口:
- 实现类给出具体的类型
- 实现类延续泛型,创建实现类对象时再确定类型;