泛型概念
是一种未知的数据类型,当我们不知道用什么数据类型的时候,就用泛型。
泛型也可以看作是一个变量,用来接收数据类型。
E e:Element元素
T t:Type类型
使用泛型的好处
不使用泛型
优点:默认的类型就是Object类,可以存储任意类型的数据。
缺点:这样非常不安全,会出现异常。
例子:我不使用泛型创建一个集合,分别存储不同类型的数据,如果想要使用某个数据类型特有的方法时,就必须向下转型,这样别的类型数据就会报异常,实际代码如下:
public class Demo01Generic {
public static void main(String[] args) {
//定义一个集合,不使用泛型
ArrayList list = new ArrayList();
list.add("aaa");
list.add(123);
//使用迭代器遍历集合
Iterator it = list.iterator();
while(it.hasNext()){
Object obj = it.next();
System.out.println(obj);
//现在我想使用String类特有的方法获取字符串的长度,就必须要向下转型。
String s = (String) obj;
System.out.println(s.length());//会抛出ClassCastException异常,不能把Integer类型转换成String类型
}
}
}
输出结果为:
aaa
Exception in thread “main” java.lang.ClassCastException: java.base/java.lang.Integer cannot be cast to java.base/java.lang.String
3
at cn.itcast.day10.demo10.Demo01Generic.main(Demo01Generic.java:18)
123
使用泛型
优点:
- 避免了类型转换的麻烦,存储的是什么类型,取出的就是什么类型。
- 把运行期异常(代码运行之后会抛出的异常)提升到编译期(写代码的时候就会报错)。
缺点:泛型是什么类型,只能存储什么类型的数据。
代码如下:
public class demo {
public static void main(String[] args) {
ArrayList<String> list = new ArrayList<>();
list.add("aaa");
//因为使用了泛型,这里就不能添加list.add(1);会报错。
//使用迭代器遍历集合
Iterator<String> it = list.iterator();
while(it.hasNext()){
String s = it.next();
System.out.println(s.length());
}
}
}
输出的结果是:3