java基础巩固,中级篇(泛型)

本博客总结网络其他文章和自己的理解,仅用于自己巩固基础跟分享给大家参考而已

1.Java泛型简介

 泛型:就是一种不确定的数据类型。
 比如:ArrayList E就是泛型。 这种不确定的数据类型需要在使用这个类的时候才能够确定出来。
 泛型可以省略,如果省略,默认泛型是Object类型。
泛型的好处:
  1. 省略了强转的代码。
  2. 可以把运行时的问题提前到编译时期。
 

2.Java泛型不能使用基本类型

java的基本类型:boolean,char,float,double,byte,int,short,long。 
使用基本类型的泛型会编译报错,代码如下:

List list = new List();// 编译前类型检查报错

因为泛型在编译时,会进行类型擦除,最后只保留原始类型。而原始类型只能是Object类及其子类,当然不能使用基本数据类型。

3.Java泛型不允许进行静态化

原因:静态变量在类中共享,而泛型类型是不确定的,因此编译器无法确定要使用的类型,所以不允许进行静态化。

4.Java泛型不允许作为参数进行重载

因为类型擦除之后,两个方法是一样的参数列表,这种情况无法重载。

5.使用泛型的好处

使用泛型的好处:
泛型的用法是在容器后面添加
Type可以是类,抽象类,接口
泛型表示这种容器,只能存放该类类型,其他类型就放不进去了

6.子类对象是否可以放

子类对象是可以的被放入的

假设容器的泛型是A,那么A的子类B,C都可以放进去

和A无关的类型D还是放不进去

7.泛型的简写

为了不使编译器出现警告,需要前后都使用泛型,像这样:

ArrayList a= new ArrayList();

不过JDK7提供了一个可以略微减少代码量的泛型简写方式:

ArrayList aa= new ArrayList<>();

后面的泛型可以用<>来代替

8.泛型通配符

泛型的通配符有以下三种

1.  ? extends

2.  ? super

3.?

打个比喻 B,C是A的子类泛型

ArrayList  lsit 表示这是一个A泛型或者其子类泛型
lsit的泛型可能是A
lsit的泛型可能是B
lsit的泛型可能是C
所以 可以确凿的是,从list取出来的对象,一定是可以转型成A的
但是,不能往里面放东西

ArrayList list 表示这是一个A泛型或者其父类泛型
list的泛型可能是A
list的泛型可能是Object
可以往里面插入A以及A的子类(B,C)
但是取出来有风险,因为不确定取出来是A还是Object

泛型通配符? 代表任意泛型
既然?代表任意泛型,那么换句话说,这个容器什么泛型都有可能
所以只能以Object的形式取出来
并且不能往里面放对象,因为不知道到底是一个什么泛型的容器

9.泛型特性

泛型只在编译阶段有效

10.泛型的使用

泛型有三种使用方式,分别为:泛型类、泛型接口、泛型方法

泛型类

泛型类型用于类的定义中,被称为泛型类。通过泛型可以完成对一组类的操作对外开放相同的接口。最典型的就是各种容器类,如:List、Set、Map。

泛型的类型参数只能是类类型,不能是简单类型。

不能对确切的泛型类型使用instanceof操作。

泛型接口

泛型接口与泛型类的定义及使用基本相同。泛型接口常被用在各种类的生产器中。

泛型方法

在java中,泛型类的定义非常简单,但是泛型方法就比较复杂了

泛型类,是在实例化类的时候指明泛型的具体类型;泛型方法,是在调用方法的时候指明泛型的具体类型 。

静态方法有一种情况需要注意一下,那就是在类中的静态方法使用泛型:静态方法无法访问类上定义的泛型;如果静态方法操作

的引用数据类型不确定的时候,必须要将泛型定义在方法上。

11.泛型数组

在java中是”不能创建一个确切的泛型类型的数组”的。

也就是说下面的这个例子是不可以的

List[] ls = new ArrayList[10];  

而使用通配符创建泛型数组是可以的,如下面这个例子:

List[] ls = new ArrayList[10]; 

这样也是可以的:

List[] ls = new ArrayList[10];

 

你可能感兴趣的:(java基础巩固)