黑马程序员--集合框架---泛型限定

 ——- android培训java培训、期待与您交流! ———-
 人生来是平等的,但后来就逐渐被分为了三六九等,任何事物亦是如此,分为各种类型,明确了类型,让操作更安全可靠,这就是泛型。我热爱我的热爱,并将继续坚持我的热爱,我会是那匹黑马。
 
一、概述
泛型:泛型的本质就是参数化类型,参数化类型重要性在于,允许创建一些类、接口和方法,其所操作的数据类型被指定为参数。例如我们可以使用泛型创建一个类,在这个类中可以自动使用不同类型的数据。
泛型格式:通过<>来定义要操作的引用数据类型。
class GenericClass
{

}
JDK1.5版本以后出现新特性。用于解决安全问题,是一个类型安全机制。
泛型的作用表现在,在没有泛型之前,可以使用Object 来表示或者创建通用的类、接口和方法,但是这样作带来后果是需要作强制类型转换,而这种转换的条件是开发人员必须预知实际的参数类型,同时如果强制类型转换错误,编译器在编译时并不检查或提示转换错误,但是一旦在运行时发现错误则会产生异常,这对于一个程序来说是非常的不安全。而泛型的作用则恰恰体现在程序编译时就对类型进行检查,同时不必再进行强制类型转换,因此处理过程得到简化,代码的重用性高,并且又安全。
在学习如何使用泛型之前,还必须要了解 2 个重要的概念:
1,参数化类型:参数化类型包含一个类或者接口,以及实际的类型参数列表。
2,类型变量:是一种非限定性标识符,用来指定类、接口或者方法的类型。

二、泛型的用法

通常在集合框架中很常见,只要见到“<>”就要定义泛型,其实<> 就是用来接收类型的。当使用集合时,将集合中要存储的数据类型作为参数传递到“<>”中即可。
在使用类型变量时还要注意一些规范的使用:
1、类型变量要使用大写字母,且比较短
2、在Java 的类库中,使用变量E 来表示集合的元素类型
3、使用字母K 和V 表示关键字和值的类型
4、字母T 表示任意类型
在使用泛型时,使用实际的类型来代替类型变量就可以实例化泛型类型。下面我们来看一个具体的泛型应用

public class GenericDemo{
public static void main(String[] args) {
GenericClass<String> ge1 = new GenericClass<String>("this is String object");
ge1.showType();
GenericClass<Integer> ge2 = new GenericClass<Integer>(100);
ge2.showType();
}
}
class GenericClass<T>{
private T obj;
public GenericClass(T obj){
this.obj=obj;
}
public T getObj(){
return obj;
}
public void showType(){
System.out.println("obj 的类型是"+obj.getClass().getName());
}
}

在GenericDemo 类中,分别创建了GenericClass 类的2 个实例,一个使用String 类型替代了类型变量T,并将字符串赋予了成员变量obj。另一个使用了Integer 类型代替了类型变量T,同时将100 赋值给了类的属性那个obj。那么在GenericClass 类中的showType()方法能够区分出域变量是String 类型还是Integer类型吗,我们通过运行程序的效果来进行检验。通过运行输出我们可以清楚的发现GenericClass 类可以识别出,实际传递的数据类型并对obj 进行赋值。换句话说就是GenericClass在使用中,能够根据T 形参的实际类型,对应创建多个逻辑形式的子类,例如 GenericClass,GenericClass等。
5 泛型类
5.1 什么是泛型类
什么是泛型类,简单的说就是具有一个或者多个类型变量的类。
5.2 如何定义泛型类
泛型类的定义比较简单,只要在类名的后面添加一对尖括号,并声明类型参数列表即可。
语法:
访问控制符 class className
TypelIst:表示类型参数列表,每个类型变量之间以逗号分隔
例如:
public class GenericClass{

}
5.3 创建泛型类的实例
创建泛型类实例时,使用指定的实际类型代替类型参数列表中的类型变量即可。
语法:
new className(argList)
TypelIst:表示类型参数列表,每个类型变量之间以逗号分隔
argList:表示参数列表,同样以逗号分隔
例如:

new GenericClass<String>(“this is String object”)
GenericClass<T>是比较常见的泛型类,在定义泛型类时,还可以指定多个类型参数,下面我们就来看一个具有两个类型参数的泛型类
class GenericDemo<T,V>{
private T a;
private V b;
public GenericDemo(T a,V b){
this.a = a;
this.b = b;
}
public void showType(){
System.out.println("a 的类型是"+a.getClass().getName());
System.out.println("b 的类型是"+b.getClass().getName());
}
}

与GenericClass类不同的是,在GenericDemo

public class Demo{
public static void main(String[] args) {
GenericDemo<String,Integer> ge1 = new
GenericDemo<String,Integer>("Jack",23);
ge1.showType();
}
}`

在创建实例时,分别使用了String 和Integer 代替了形参T 和V,当然对于T 和V 两个形参,我们可以使用同一数据类型进行替代,只不过这样的话就不需要设置两个参数类型了。
6 泛型接口
6.1 什么是泛型接口
什么是泛型接口,泛型接口就是拥有一个或多个类型变量的接口
6.2 如何定义泛型接口
泛型接口的定义方式与定义泛型类类似
访问控制符 interface interfaceName
TypeList:表示由逗号分隔的一个或多个类型参数列表而实现泛型接口的类,也必须要指定参数类型。
语法:
Class className implements interfaceName
使用泛型接口时有几点需要注意:
1、一旦建立类型参数,在实现时将它不加修改地直接传递给接口即可
2、如果一个实现了一个泛型接口,那么这个类必须也是泛型
3、当一个实现了一个特定类型的泛型接口,这个类不必指定为泛型
泛型接口的优势:
1、针对不同的数据类型进行实现
2、允许对这些接口的数据类型进行限制
7 泛型方法
7.1 什么是泛型方法
泛型方法实际上就是带有参数类型的方法
需要特别注意的是,定义泛型方法与方法所在的类、或者接口是否是泛型类或者泛型接口没有直接的联系,也就是说无论是泛型类还是非泛型类,如果需要就可以定义泛型方法。
泛型类定义的泛型,在整个类中有效。如果被方法使用,那么泛型类的对象明确要操作的具体类型后,所有要操作的类型就已经固定了。
为了让不同方法可以操作不同类型,而且类型还不确定。那么可以将泛型定义在方法上。
特殊之处:
静态方法不可以访问类上定义的泛型。如果静态方法操作的应用数据类型不确定,可以将泛型定义在方法上。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值