六、泛型
6.1、泛型的概述
泛型其实就是一种数据类型,主要用于某个类或者接口中的数据类型不确定的时候,可以用一个标识符或者占位符来标书未知的数据类型,然后再使用该类或者该接口的时候可以指定该位置类型的真实类型
泛型可以用到接口、类、方法中,将数据类型作为参数传递,其实更像是一种数据类型的模板。
如果不使用泛型的话,从容器中获取出来的元素,由于我们不知道类型,所以需要强制类型转换
6.2、自定义和使用泛型
定义泛型
我们可以使用一个标识符,比如T(Type)在类中表示一种未知的数据类型
//在类上声明使用符号T,表示未知的类型 public class Point<T> { private T x; private T y; //省略getter/setter }
使用泛型
一般在创建对象时,给未知的类型设置一个具体的类型,当没有指定泛型时,默认类型为Object类型。
//没有使用泛型,默认类型是Object Point p1 = new Point(); Object x1 = p1.getX(); //使用String作为泛型类型 Point<String> p2 = new Point<String>(); String x2 = p2.getX(); //使用Integer作为泛型类型 Point<Integer> p3 = new Point<Integer>(); Integer x3 = p3.getX();
6.3、在集合中使用泛型
class ArrayList<E>{ public boolean add(E e){ } public E get(int index){ } }
此时的E也仅仅是一个占位符,我们知道这里仅仅只是一个元素,但是不知道是什么类型,E表示元素(Element)的类型,那么当使用容器时给出泛型就表示,该容器只能存储某种类型的数据。
//只能存储String类型的集合 List<String> list1 = new ArrayList<String>(); list1.add("A"); list1.add("B"); //只能存储Integer类型的集合 List<Integer> list2 = new ArrayList<Integer>(); list2.add(11); list2.add(22)
由于集合的前后两个类型必须相同,所以在JDK1.8之后就可以省略后面实例化对象的时候的泛型的书写
List<String> list1 = new ArrayList<String>(); // 可以简写为 List<String> list1 = new ArrayList<>();
注意
1.泛型必须是引用类型,不能是基本数据类型
List<int> list = new ArrayList<int>();//编译错误
- 泛型不存在继承的关系
List<Object> list = new ArrayList<String>(); //编译错误
方法中,将数据类型作为参数传递,其实更像是一种数据类型的模板。
如果不使用泛型的话,从容器中获取出来的元素,由于我们不知道类型,所以需要强制类型转换
作者:XiaoLin_Java
链接:https://juejin.cn/post/6983686380119392264
来源:稀土掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。