1.泛型
如果不写泛型,集合也是可以创建的,只不过默认就是Object类型。
弊端:当我们获取集合中元素的时候,无法使用子类的特有功能。
如果我们想用,只能向下转型。
但是在转型的时候,有可能会导致类型转换异常。
好处:
规定了存储数据的类型。
当我们存储时,获取时就一定是泛型里面的数据类型。
我们可以统一类型,也可以使用子类特有的方法。
注意:
泛型里面不能写基本数据类型。只能写引用数据类型。
如果我们要存一个整数,不能写int。只能写Integer。
2.泛型类
格式
定义一个类,在后面写一个尖括号即可。
尖括号里面的是什么?是类型吗? 在定义的时候仅仅是一个变量而已。
public class Gen<Q> {
Q q;
}
//此时Q仅仅是一个变量而已,没有任何的数据类型
当创建Gen这个类的对象时就给Q赋值。
Gen<Integer> g = new Gen<>();
//此时给Q赋了个Integer的值。
3.泛型方法
掌握的不是如何自己写一个泛型方法,而是如何调用。
练习1.
ArrayList<String> list = new ArrayList<>();
list.add("aaa");
list.add("bbb");
list.add("ddd");
String[] integers = list.toArray(new String[10]);
for (String integer : integers) {
System.out.println(integer);
}
练习2:
ArrayList<Integer> list = new ArrayList<>();
list.add(1);
list.add(2);
list.add(3);
Integer[] integers = list.toArray(new Integer[10]);
for (Integer integer : integers) {
System.out.println(integer);
}
//打印结果, 引用数据类型默认初始化值是null
//注意:Integer是引用数据类型。
练习3:
ArrayList<Integer> list = new ArrayList<>();
list.add(1);
list.add(2);
list.add(3);
list.toArray(new int[10]);//报错
//因为泛型里面只能写引用数据类型。
练习4:
ArrayList<Integer> list = new ArrayList<>();
list.add(1);
list.add(2);
list.add(3);
//toArray底层做了一个判断
//传递数组的长度跟集合长度进行了判断
//规则:
//谁长听谁的,不足null补齐。
Integer[] integers = list.toArray(new Integer[0]);
System.out.println(Arrays.toString(integers));//[1, 2, 3]
System.out.println(integers.length);//3
//书写规则:
//0 简单
//集合的长度 最为合理的值
4,泛型接口
使用规则:
1.实现类实现泛型接口的时候直接赋值。
public class Student implements Comparable<Student>
2.实现类实现泛型接口的时候不赋值,把这个泛型接口引用下来。
在创建实现类对象的时候赋值。
public class Student<E> implements Comparable<E>
5.通配符
1、泛型的通配符是什么?
就是一个 问号 ?
2、什么是上限,什么是下限?
? extends E
? super E
|
|