泛型深入
泛型:可以在编译阶段约束操作的数据类型,并进行检查
泛型的格式:<数据类型>
注意:泛型只能支持引用数据类型
//没有泛型的时候,集合如何存储数据
//如果我们没有给集合指定类型,默认认为所有的数据类型都是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<E> {
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) {
MyGenerics<String> list = new MyGenerics<>();
list.add("aaa");
list.add("bbb");
list.add("ccc");
list.add("ddd");
// System.out.println(list);
}
方法上面 泛型方法
方法中形参的类型不确定时,可以使用类名后面定义的泛型<E>
public class ListUtil {
private ListUtil(){}
//类中定义一个静态方法addAll,用来添加多个集合的元素
/*
参数一:集合
参数二:元素
*/
public static <E> void addAll(ArrayList<E> 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) {
ArrayList<String> list = new ArrayList<>();
ListUtil.addAll(list, "a", "b", "c", "d");
System.out.println(list);
}
}
接口后面 泛型接口
如何使用?
方式1:实现类给出具体类型
方式2:实现类延续泛型,创建对象时在确定