泛型

泛型:编写的代码可以被很多不同类型的对象所重用,可以分为三种:

(1)泛型类:ArrayList,HashSet,HashMap等

(2)泛型方法:Collections.binarySearch,Arrays.sort等

(3)泛型接口:List,Iterator等

java 泛型 自己引用自己_泛型类

这些类是JDK提供给我们的,我们能够使用的泛型类。那么如何自己设计出相应的泛型类、泛型方法和泛型接口

自定义泛型(1):泛型类

泛型类:

---- 具有泛型变量的类(类里面至少有一个成员变量是泛型变量)

---- 在类名后用 <T> 代表引入类型:

注意:多个字母表示多个引入类型如 <T, U>等

           引入类型可以修饰成员变量 / 局部变量 / 参数 / 返回值

           没有专门的template关键字(C++里面有template关键字,Java里面采用 <T>来表示泛型)

java 泛型 自己引用自己_泛型类_02

自定义泛型(2):

泛型类调用:传入具体的类型(上面是完成了泛型类的定义,接下来是使用这个泛型类。在创建对象时,我们给它传入指定的类型)

Interval<Integer>  v1 = new  Interval<Integer> (1, 2);

Interval<Integer>  v1 = new  Interval<> (1, 2);  // 这种写法也可以,叫做菱形语法,可以根据左侧的类型推断出来,所以可以省略

java 泛型 自己引用自己_泛型_03

自定义泛型(3):

泛型类调用实例:

java 泛型 自己引用自己_泛型_04

自定义泛型(4):泛型方法

泛型方法:

---- 具有泛型参数的方法

---- 泛型方法可以在普通类中,也可以在泛型类中存在

---- 方法定义时有个 <T> 指的是整个泛型方法的引入类型,它的位置在修饰符(public static)后面,在返回类型的前面

java 泛型 自己引用自己_泛型_05

其中, T. . .  a是语法糖知识,表示泛型的数组a,三个点表示不定项参数。<T>表示整个泛型方法的引入类型,方法中的T表示方法的返回值类型

java 泛型 自己引用自己_泛型类_06

注意这种调用方式,调用泛型方法的时候,给它指定好具体的类型,这个类型是写在方法名的前面,这个位置需要注意。也可以用菱形写法,比如传入Integer类型,因为他可以从后面的参数进行局部推断。

自定义泛型(5):泛型接口

泛型接口:和泛型类相似,在类名后面加 <T> ,其中T是用来指定方法的返回值和参数

                  当要实现这个接口时,指定类型

java 泛型 自己引用自己_泛型_07

1.定义一个泛型接口

java 泛型 自己引用自己_泛型类_08

2.定义一个测试类实现这个泛型接口,add方法内的形参和返回值都是Integer类型

java 泛型 自己引用自己_泛型类_09

3.两种测试方法,第一种是把实现泛型接口的类当做普通类,直接new一个对象。第二种是把new出来的对象转型为父接口的类型对象,一样可以调用方法

自定义泛型(6):

在自定义泛型接口时,T本身可以再是一个泛型类

java 泛型 自己引用自己_泛型_07

java 泛型 自己引用自己_泛型类_11

java 泛型 自己引用自己_泛型类_12

总结:自定义泛型设计

---- 泛型类:整个类都被泛化,包括变量和方法

---- 泛型方法:方法被泛化,包括返回值和参数

---- 泛型接口:泛化子类(实现整个泛型接口的类)方法