泛型可以看作是一个"变量", 用来接收数据类型int a = 10;
a = 20;定义:
<E>: 声明了一个泛型 (声明了一个变量)
E: 使用E这种类型作为数据类型 (参数数据类型, 返回值类型)
使用:
ArrayList<Integer>: 确定了泛型的具体类型public class ArrayList<E> { // E可以表示任意的引用类型, 但是只能表示某一种
String name;
int age;
E e;
public boolean add(E e){} String
public E get(int index){}
}ArrayList<String> list = new ArrayList<>();
ArrayList<Integer> list = new ArrayList<>();
// 如果没有泛型, 想设计添加指定类型的集合, 就不好实现:
// 添加String元素的集合
public class ArrayList1 {
public boolean add(String e){}
public String get(int index){}
}
// 添加Student元素的集合
public class ArrayList2 {
public boolean add(Student e){}
public Student get(int index){}
}
// 即便可以使用Object作为参数, 但这样任意类型元素都能添加, 却无法限制只能添加某一种特定类型的元素
public class ArrayList {
public boolean add(Object e){}
public Object get(int index){}
}
// 遍历的时候强转类型就可能出问题
for (int i = 0; i < list.size(); i++) {
Object o = list.get(i);
String s = (String)o; // 万一取出的元素不是String呢?
}
补充: 泛型的好处知识点:
如果集合不使用泛型, 存储的是什么类型的元素
集合不使用泛型会有什么安全隐患
总结:
不使用泛型的问题:
集合实际存储的是 Object 类型, 存入的元素无论是什么类型, 都会被提升为 Object, 取出来的也是 Object, 要想调用元素特有方法, 就要向下转型, 有可能发生类型转换异常 ClassCastException泛型的好处:
1. 避免了类型转换的麻烦
2. 将运行时的类型转换异常, 转移到了编译时期 (有利于程序员提前发现问题)
补充: 定义和使用含泛型的类知识点:
如何在类的声明上定义泛型
如何在类中使用泛型
何时确定类中泛型的具体类型
总结:
定义泛型
<泛型名> 泛型的"定义"和"使用"
泛型在"定义"时, "不能是"具体的类型, 只是一个变量名: public class ArrayList<E> {}
泛型在"使用"时, "必须是"具体的数据类型 ArrayList<Integer>
// 带有泛型的类定义格式
修饰符 class 类名<代表泛型的名字> { // 泛型的变量一般用一个大写字母表示, 但也可以是多个字母 }