JAVA中的泛型

开发工具与关键技术:JAVA中的泛型

作者:邓崇富

撰写时间:2019 年 4 月 15日

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

一、定义泛型

1、定义泛型类时也可以声明多个类型

在定义泛型类时,可以声明多个类型。语法如下:

   JAVA中的泛型

其中,T1T2为能被定义的类型。

这样在实例化指定类型的对象时就可以指定多个类型。例如:

JAVA中的泛型

2定义泛型类时声明数组类型

           在定义泛型类时也可以声明数组类型,下面的实例中定义泛型时便声明了数组型:

JAVA中的泛型

运行结果如下图:

JAVA中的泛型

本实例在定义泛型类时声明一个成员数组,数组的类型为泛型,然后在泛型类  中相应设置setT()方法。

   可见,可以在使用泛型机制时声明一个数组,但是不可以使用泛型来建立数组的实例。例如:

JAVA中的泛型

二、泛型的高级用法

1、型可用类型      

默认可以使用任何类型来实例化一个泛型对象,单java中也对泛型类实例的类型作了限制。语法如下:

Class 类名称<T extends anyClass>

其中,anyClass 指某个接口或类。

 使用泛型限制后,泛型类的类型必须实现或继承了anyClass这个接口或类型。无论anyClass是接口还是类,在进行泛型限制时都必须使用extends关键字。

例如在项目中创建LimitClass类,在该类中限制泛型类型:

JAVA中的泛型

在上面的例子中,将泛型作了限制,设置泛型类型必须实现List接口。

当没有使用extends关键字限制泛型类型时,默认Object类下的所有子类都可以实例化泛型对象。如下图的两个语句是等价的:

JAVA中的泛型

2、类型通配符

在泛型中机制中,提供了类型通配符,其主要作用是在创建一个泛型类对象是限制这个泛型类的类型实现或继承某个接口或子类。要声明这样一个对象可以使用? 通配符来表示,同时使用extends关键字来对泛型加以限制。

使用泛型类型通配符的语法如下:

JAVA中的泛型

其中,<? Extends List>a=null;表示类型未知,当需要使用该泛型对象时,可以单独实例化。

在泛型中使用通配符形式如下:

JAVA中的泛型

在使用通配符声明的名称实例化的对象不能对其加入新的信息,只能获取或删除,例如下图:

JAVA中的泛型

3、继承泛型类

     在类中继承泛型类,如果在SubClass类继承ExtendClass类时保留父类的泛型类型,需要在继承时指明,如果没有指明,直接使用extends ExtendsClass语句进行继承操作,则SubClass类中的I4、I5和I6都会·自动变为Object,所以在一般情况下都将父类的泛型类型保留。

代码如下图:

JAVA中的泛型

总结一下泛型的使用方法:

  1.  泛型的类型参数只能是类类型,不可以是简单类型,如:A<int>这种泛型定义就错误的。
  2. 泛型的类型个数可以是多个。
  3. 可以使用extends关键字限制泛型的类型。
  4. 可以使用通配符限制泛型的类型。