8.泛型

本章要点

  • 编译时类型检查的重要性
  • 使用泛型实现编译时进行类型检查
  • 定义泛型接口,泛型类
  • 派生泛型接口,泛型类的子类,实现类
  • 使用类型通配符
  • 设定类型通配符的上限
  • 设定类型形参的上限
  • 在方法签名中定义类型形参
  • 泛型方法和类型通配符的区别和联系
  • 设定类型通配符的下限
  • 泛型方法与方法重载
  • 擦除与转换
  • 泛型与数组

本章的知识可以与前一章内容补充阅读,因为JDK1.5增加泛型支持很大程度上都是为了让集合能记住其元素的数据类型。在没有泛型之前,一旦把一个对象“丢进”java集合中,集合就会忘记对象的类型,把所有的对象当成Object类型处理。当程序从集合中取出对象后,就需要进行强制类型转换,这种强制类型转换不仅代码臃肿,而且容易引起ClassCastException异常。

增加了泛型支持后的集合,完全可以记住集合中元素的类型,并可以在编译时检查集合中元素的类型,如果试图向集合中添加不满足类型要求的对象,编译器就会提示错误。增加泛型后的集合,可以让代码更加简洁,程序更加健壮(java泛型可以保证如果程序在编译时候没有警告,运行时就不会产生ClassCastException异常)。除此之外,java泛型还增加了枚举类,反射等方面的功能。

8.1 泛型入门

java的集合有个缺点:当我们把一个对象“丢进”集合里后,集合就会“忘记”这个对象的数据类型,当再次取出该对象时,该对象的编译类型就变成了Object类型(其运行时类型没变)。

java集合之所以被设计成这样,是因为设计集合的程序员不会知道我们需要用它来保存什么类型的对象,所以它们把集合设计成能保存任何类型的对象,只要求具有很好的通用性。但这样做也带来两个问题:

  • 集合对元素类型没有任何限制,这样可能引发一些问题:例如像创建一个只能保存Dog对象的集合,但程序也可以轻易地将Cat对象“丢”进去,所以可能引发异常。
  • 由于把对象“丢进”集合时,集合丢失了对象的状态信息,集合只知道它盛装的是Object,因此取出集合元素后通常还需要进行强制类型转换。这种情况强制类型转换既会增加编程的复杂度,也可能引发ClassCastException。

8.1.1 编译时不检查类型的异常

8.1.2 手动实现编译时检查类型

8.1.3 使用泛型

创建这种特殊集合的方法是:在集合接口,类后增加尖括号后,尖括号里放一个数据类型,即表明这个集合接口,集合类只能保存特点类型的对象。

8.2 深入泛型

所谓泛型:就是允许在定义类,接口时指定类型形参,这个类型形参将在声明变量,创建对象时确定(即传入实际的类型参数,也可称为类型实参)。

8.2.1 定义泛型接口,类

8.2.2 从泛型类派生子类

注意:

方法中的形参(这种形参代表变量,常量,表达式等数据,本书把它们直接称为形参,或者称为数据形参),只有当定义方法时才可以使用数据形参,当调用方法(使用方法)时必须为这些数据形参传入实际的数据;与此类似的是:类,接口中的类型形参,只有在定义类,接口时才可以使用类型形参,当使用类,接口时应为类型形参传入实际的类型。

8.2.3 并不存在泛型类

8.3 类型通配符

8.3.1 使用类型通配符

为了表示各种泛型List的父类,我们需要使用类型通配符,类型通配符是一个问号(?),将一个问号作为类型实参传给List集合,写作:List<?>(意思是未知类型元素的List)。这个问号(?)被称为通配符,它的元素类型可以匹配任何类型。

8.3.2 设定类型通配符的上限

List<? extends Shape>

8.3.3 设定类型形参的上限

java泛型不仅允许在使用通配符形参时设定类型上限,也可以在定义类型形参时设定上限,用于表示传给该形参的实际类型必须是该上限类型,或是该上限类型的子类。

8.4 泛型方法

前面介绍了在定义类,接口时可以使用类型形参,在该类的方法定义个属性定义,接口的方法定义中,这些类型形参可被当成普通类型来用。在另外一些情况下,我们定义类,接口时没有使用类型形参,但定义方法时想自己定义类型形参,这也是可以的,JDK1.5还提供了泛型方法的支持。

8.4.1 定义泛型方法

8.4.2 泛型方法和类型通配符的区别

8.4.3 设定通配符的下限

8.4.4 泛型方法与方法重载

8.5 擦除和转换

8.6 泛型与数组

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值