第十二章
一 、泛型
泛型的实质就是将数据类型参数化,通过为类,接口及方法设置类型参数来定义泛型。
泛型使一个类或一个方法可在多种不同类型的对象上进行操作,使用泛型意味着编写的代码可以被很多类型不同的对象所重用,从而减少数据类型转换潜在的错误。
1 .泛型的概念
泛型实际上是在定义类,接口或方法时通过为其增加“类型参数”来实现的。即泛型所操作的数据类型被指定为一个参数,这个参数被称为类型参数,所以说,泛型的实质是将数据的类型参数化。
当这种类型参数用在类,接口,以及方法的声明中时,则分别称为泛型类,泛型接口和泛型方法。
基本格式:
泛型类的定义:修饰符 class 类名
泛型接口的定义:public interface 接口名
泛型方法的定义:public static 返回值类型 方法名(T 参数)
定义泛型之后,就可以在代码中使用类型参数T来表示某一种数据的类型而非数据的值,即T可以看作泛型的一种“类型形式参数”。在定义类型参数后,就可以在类体或接口中定一的各个部分直接使用这些类型参数。
而在使用这些具有泛型特性的类或接口时,需要指明实际的具体类型,即用“类型实际参数”来替换“类型形式参数”,也就是说,用泛型类创建的对象就是在类体内的每个类型参数T处分别使用这个具体的实际类型替代。
泛型的世家参数必须是类类型,利用泛型类创建的对象称为泛型对象,这个过程也称为泛型实例化
因此,泛型的概念实际上时基于“类型也可以先变量一样实现参数化”这一简单的设计理念实现的,因此泛型也称为参数多态。
2.泛型类及其应用
在使用泛型定义的类创建对象时,即在泛型实例化时,可以根据不同的需求给出类型参数T的具体类型。
而在调用泛型类的方法传递或返回数据类型时可以不用进行类型转换,而是直接使用T作为类型来替代参数类型或返回值类型。
3. 泛型方法
要定义泛型方法,只需要将泛型的类型参数设置于返回值类型前面即可。
一般来说,编写Java泛型方法时,返回值类型和至少一个参数类型应该时泛型,而且类型应该时一致的,如果只有返回值类型或惨啊书类型之一使用了泛型,这个泛型方法的使用就大大的受限制,基本限制到与不使用泛型一样的程度
当使用泛型类时,必须在创建泛型对象的时候指定类型参数的实际值,而调用泛型方法时,通常不必知名参数。
4 .限制泛型的可用类型
在定义泛型类时,默认可以使用任何类型来实例化一个泛型类都一项,当在Java语言中,也可以在泛型类创建对象时对数据类型做出限制,语法格式为:
class ClassName
该语句表示T时ClassName类的类型参数,且T有一个限制,即T必须是anyClass类及其子类或是实现了anyClass接口的类。且无论anyClass是类或接口,在进行泛型限制时都必须使用extends关键字
对于实现了某接口的有限制泛型,也就是extends关键字,而不是implements关键字
注:子类泛型并不是一种父类泛型
5. 泛型的类型通配符和泛型数组的应用
泛型通配符的主要作用:
用于创建可重新赋值但不可修改其内容的泛型对象、
是用在方法的参数中,限制传入不想要的类型实参
当需要在一个程序中使用同一个对象名区应用不同的对象时,这是就需要使用通配符“?”创建泛型类对象。
但是条件是被创建的这些不同泛型对象的类型实参必须是某个类或是继承该类的子类或是实现某个接口的类。
通配符“?”除了在创建泛型类对象时限制泛型类的类型之外,还可以将由通配符限制的泛型类对象用在方法的参数中防止传入不允许接收的类型参数。
在创建泛型类对象时,如果只是用了“?”通配符,则默认时“? extends Object",所以”?“也被称为非受限通配。
对于一个泛型类来说,在创建相应的泛型类对象时,类型参数T除了使用某个实际类型替换外,话可以用通配符"?",但是这两者的用法时不一样的。
直接使用通配符<?>创建泛型对象,有两个 特点:
具有通用性,即该反省类的其他对象可以赋值给通配符”?“创建的泛型对象,因为”?“等价于”? extends Object“,反之不可。
用通配符”?“创建的泛型对象,只能获取或删除其中的信息,当不可为其添加新的信息。
引入通配符的主要目的是,支持泛型中的子类,从而实现多态。如果泛型方法的目只是为了能够适用于多种不同类型或支持多态,则应选用通配符。
6.继承泛型类与实现泛型接口
被定义为泛型的类或接口可被继承与实现
在定义泛型接口时,泛型接口也可被实现
如:interface in{}
class SubClass<T1,T2>implements in{}