Java笔记-泛型
引入
由于之前不能够对加入到集合中的元素进行约束,可能会出现类型转换异常ClassCastException的异常。(不安全💔)
在遍历集合的时候,需要类型转换,数据量一大,效率就低。(效率低💔)
| @SuppressWarnings({"all"}) public class generic01 { public static void main(String[] args) { ArrayList list = new ArrayList(); list.add(new Dog("tom", 3)); list.add(new Dog("jack", 5)); list.add(new Dog("lily", 1));
list.add(new Cat("kitty", 4));
for (Object o : list) { System.out.println(((Dog) o).getName() + "-" + ((Dog) o).getAge()); } } }
|

使用泛型后,通过对存入到集合中元素进行类型约束,可以自动检查添加的元素类型是否是约定的类型;
同时在遍历时,不需要再进行转型,使得效率提高🧡🧡。
| public class generic01 { public static void main(String[] args) { ArrayList<Dog> list = new ArrayList<Dog>(); list.add(new Dog("tom", 3)); list.add(new Dog("jack", 5)); list.add(new Dog("lily", 1));
for (Dog o : list) { System.out.println(o.getName() + "-" + o.getAge()); } } }
|
如果将上面的那行代码取消注释,试图向list中添加Cat对象时,idea将会提示我有语法错误,这正体现出使用泛型的一个好处就是类型进行【约束】,保证了代码的安全性。
❌错误提示:

是什么?


在编译时就确定E是什么类型;
使用

1、泛型中指定的数据类型必须是应用类型,不可以是基本数据类型(short\int\long\byte\float\double\boolean\char);
2、指定泛型后,传入的类型可以是指定的类型,也可以是其子类型;
3、泛型的使用形式
下面两种都可以,推荐使用第二种,更加简洁。
| ArrayList<Integer> list1 = new ArryList<Integer>(); ArrayList<Integer> list2 = new ArryList<>(); ArrayList list3 = new ArryList();
|
自定义泛型/泛型接口/泛型方法
| class 类名<T,R...>{ 成员 }
interface 接口名<T,R...>{ }
修饰符 <T,R...> 返回类型 方法名(参数列表){ }
|



