泛型
泛型:编写的代码可以被很多不同类型的对象所重用,可以分为三种:
(1)泛型类:ArrayList,HashSet,HashMap等
(2)泛型方法:Collections.binarySearch,Arrays.sort等
(3)泛型接口:List,Iterator等
这些类是JDK提供给我们的,我们能够使用的泛型类。那么如何自己设计出相应的泛型类、泛型方法和泛型接口
自定义泛型(1):泛型类
泛型类:
---- 具有泛型变量的类(类里面至少有一个成员变量是泛型变量)
---- 在类名后用 <T> 代表引入类型:
注意:多个字母表示多个引入类型如 <T, U>等
引入类型可以修饰成员变量 / 局部变量 / 参数 / 返回值
没有专门的template关键字(C++里面有template关键字,Java里面采用 <T>来表示泛型)
自定义泛型(2):
泛型类调用:传入具体的类型(上面是完成了泛型类的定义,接下来是使用这个泛型类。在创建对象时,我们给它传入指定的类型)
Interval<Integer> v1 = new Interval<Integer> (1, 2);
Interval<Integer> v1 = new Interval<> (1, 2); // 这种写法也可以,叫做菱形语法,可以根据左侧的类型推断出来,所以可以省略
自定义泛型(3):
泛型类调用实例:
自定义泛型(4):泛型方法
泛型方法:
---- 具有泛型参数的方法
---- 泛型方法可以在普通类中,也可以在泛型类中存在
---- 方法定义时有个 <T> 指的是整个泛型方法的引入类型,它的位置在修饰符(public static)后面,在返回类型的前面
其中, T. . . a是语法糖知识,表示泛型的数组a,三个点表示不定项参数。<T>表示整个泛型方法的引入类型,方法中的T表示方法的返回值类型
注意这种调用方式,调用泛型方法的时候,给它指定好具体的类型,这个类型是写在方法名的前面,这个位置需要注意。也可以用菱形写法,比如传入Integer类型,因为他可以从后面的参数进行局部推断。
自定义泛型(5):泛型接口
泛型接口:和泛型类相似,在类名后面加 <T> ,其中T是用来指定方法的返回值和参数
当要实现这个接口时,指定类型
1.定义一个泛型接口
2.定义一个测试类实现这个泛型接口,add方法内的形参和返回值都是Integer类型
3.两种测试方法,第一种是把实现泛型接口的类当做普通类,直接new一个对象。第二种是把new出来的对象转型为父接口的类型对象,一样可以调用方法
自定义泛型(6):
在自定义泛型接口时,T本身可以再是一个泛型类
总结:自定义泛型设计
---- 泛型类:整个类都被泛化,包括变量和方法
---- 泛型方法:方法被泛化,包括返回值和参数
---- 泛型接口:泛化子类(实现整个泛型接口的类)方法