泛型深入
泛型:可以在编译阶段约束操作的数据类型,并进行检查
泛型的格式:<数据类型>
注意:泛型只能支持引用数据类型
//没有泛型的时候,集合如何存储数据 //如果我们没有给集合指定类型,默认认为所有的数据类型都是Object类 //此时可以在集合添加任意的数据类型 //带来一个坏处,我们在获取数据的时候,无法使用他的特有行为 //此时推出了泛型,可以在添加数据的时候,将数据类型统一 //而且让我们获取数据的时候,也可以进行强转 //1.创建集合 ArrayList list = new ArrayList<>(); //2.添加数据 list.add(123); list.add("aaa"); System.out.println(list); //3.遍历集合 Iterator iterator = list.iterator(); while (iterator.hasNext()){ Object next = iterator.next(); //多态的弊端是无法访问子类的特有功能 System.out.println(next); } }
泛型的好处:
同意数据类型。把运行时期的问题提前到了编译期间,避免了强制类型转换可能出现的异常,因为在编译阶段类型就能确定下来
Java中的泛型都是伪泛型
泛型的细节:
泛型中不能写基本数据类型
指定泛型的具体类型后,传递数据时,可以传入该类类型或者其子类类型
如果不写泛型,类型默认为Object
泛型可以在很多地方进行定义:
类后面 泛型类
当一个类中,某个变量的数据类型不确定时,就可以定义带有泛型的类
/* 当我在编写一个类的时候,不确定类型,那么这个类型就可以定义为泛型类 * */ public class MyGenerics{ Object[] obj = new Object[10]; int size; /* E: 表示不确定的类型,该类型在类名后面定义过 * */ public boolean add(E e) { obj[size] = 0; size++; return true; } public E get(int index) { return (E) obj[index]; } @Override public String toString() { return Arrays.toString(obj); } }
public static void main(String[] args) { MyGenericslist = new MyGenerics<>(); list.add("aaa"); list.add("bbb"); list.add("ccc"); list.add("ddd"); // System.out.println(list); }
方法上面 泛型方法
方法中形参的类型不确定时,可以使用类名后面定义的泛型
public class ListUtil { private ListUtil(){} //类中定义一个静态方法addAll,用来添加多个集合的元素 /* 参数一:集合 参数二:元素 */ public staticvoid addAll(ArrayList list,E e,E e2,E e3,E e4){ list.add(e); list.add(e2); list.add(e3); list.add(e4); } }
public class Demo3 { public static void main(String[] args) { ArrayListlist = new ArrayList<>(); ListUtil.addAll(list, "a", "b", "c", "d"); System.out.println(list); } }
接口后面 泛型接口
如何使用?
方式1:实现类给出具体类型
方式2:实现类延续泛型,创建对象时在确定