本博客总结网络其他文章和自己的理解,仅用于自己巩固基础跟分享给大家参考而已
泛型:就是一种不确定的数据类型。
比如:ArrayList
泛型可以省略,如果省略,默认泛型是Object类型。
泛型的好处:
1. 省略了强转的代码。
2. 可以把运行时的问题提前到编译时期。
java的基本类型:boolean,char,float,double,byte,int,short,long。
使用基本类型的泛型会编译报错,代码如下:
List list = new List();// 编译前类型检查报错
因为泛型在编译时,会进行类型擦除,最后只保留原始类型。而原始类型只能是Object类及其子类,当然不能使用基本数据类型。
原因:静态变量在类中共享,而泛型类型是不确定的,因此编译器无法确定要使用的类型,所以不允许进行静态化。
因为类型擦除之后,两个方法是一样的参数列表,这种情况无法重载。
使用泛型的好处:
泛型的用法是在容器后面添加
Type可以是类,抽象类,接口
泛型表示这种容器,只能存放该类类型,其他类型就放不进去了
子类对象是可以的被放入的
假设容器的泛型是A,那么A的子类B,C都可以放进去
和A无关的类型D还是放不进去
为了不使编译器出现警告,需要前后都使用泛型,像这样:
ArrayList a= new ArrayList();
不过JDK7提供了一个可以略微减少代码量的泛型简写方式:
ArrayList aa= new ArrayList<>();
后面的泛型可以用<>来代替
泛型的通配符有以下三种
1. ? extends
2. ? super
3.?
打个比喻 B,C是A的子类泛型
ArrayList lsit extends A> 表示这是一个A泛型或者其子类泛型
lsit的泛型可能是A
lsit的泛型可能是B
lsit的泛型可能是C
所以 可以确凿的是,从list取出来的对象,一定是可以转型成A的
但是,不能往里面放东西
ArrayList list super A> 表示这是一个A泛型或者其父类泛型
list的泛型可能是A
list的泛型可能是Object
可以往里面插入A以及A的子类(B,C)
但是取出来有风险,因为不确定取出来是A还是Object
泛型通配符? 代表任意泛型
既然?代表任意泛型,那么换句话说,这个容器什么泛型都有可能
所以只能以Object的形式取出来
并且不能往里面放对象,因为不知道到底是一个什么泛型的容器
泛型只在编译阶段有效
泛型有三种使用方式,分别为:泛型类、泛型接口、泛型方法
泛型类
泛型类型用于类的定义中,被称为泛型类。通过泛型可以完成对一组类的操作对外开放相同的接口。最典型的就是各种容器类,如:List、Set、Map。
泛型的类型参数只能是类类型,不能是简单类型。
不能对确切的泛型类型使用instanceof操作。
泛型接口
泛型接口与泛型类的定义及使用基本相同。泛型接口常被用在各种类的生产器中。
泛型方法
在java中,泛型类的定义非常简单,但是泛型方法就比较复杂了
泛型类,是在实例化类的时候指明泛型的具体类型;泛型方法,是在调用方法的时候指明泛型的具体类型 。
静态方法有一种情况需要注意一下,那就是在类中的静态方法使用泛型:静态方法无法访问类上定义的泛型;如果静态方法操作
的引用数据类型不确定的时候,必须要将泛型定义在方法上。
在java中是”不能创建一个确切的泛型类型的数组”的。
也就是说下面的这个例子是不可以的
List[] ls = new ArrayList[10];
而使用通配符创建泛型数组是可以的,如下面这个例子:
List>[] ls = new ArrayList>[10];
这样也是可以的:
List[] ls = new ArrayList[10];