core Java笔记06— —泛型

泛型程序设计,即编写的代码可以对多种不同类型的对象重用。

使用泛型的好处:
在这之前,我们采用继承程序设计,这会带来一个问题,例如我们传递一个ArrayList类,往其中赋值,我们可以往数组中添加任何值,但在获取的时候,我们需要对传递的值进行强制类型抓换。此时就容易出问题。引入类型参数,可以用ArrayList<数据类型>就可以轻易的看出传递的类型。使程序更加易读也更加安全。

如何使用泛型:
泛型类是一个或者多个类型变量的类。我们会一个类可以用类名,其中这个类型变量T在整个类定义中用于指定方法的返回类型以及字段和局部变量的类型。
我们可以使用具体的类型来替换类型变量来实例化,它可以有构造器,可见泛型类似于一个工厂类。

泛型方法:
我们可以定义一个有类型参数的方法例如
public staticT getMethod(T…a){…}
注意类型变量放在修饰符后并在返回类型前。同时我们要注意调用方法时传递的数据类型。

类型变量的限定:有时,类和方法需要对类型变量进行约束,但由于类型变量可以是任意一个类,但对于一些方法,其只能是某个接口下的,此时我们可以在<T extends 接口>设置限定来实现,这表示T是该限定类型的子类型。

泛型代码和虚拟机:
泛型的擦除:无论何时定义泛型,都会自动提供一个原始类型,这个原始类型就是去掉类型参数后的泛型类型名。类型变量会被擦除,并替换为其限定类型(对于无限定的变量会替换成Object)
转换泛型表达式:编写一个泛型调用时,在我们调用方法时,编译器会插入强制类型转换,即编译器中会有两条指令:
对原始方法的调用
强返回类型强制转换为我们需要的类型
转换泛型的方法:
一些方法可能会去处理多个类型,即我们希望它调用多态性,调用最合适的方法。但类型擦除会与多态产生冲突,故引入桥方法。在原定义方法后加上{方法名(对象类型)变量名}。
我们对于泛型转换可以总结如下:
虚拟机中没有泛型,只有普通类和方法
所有的类型参数都会替换为它们的限定类型。
会合成桥方法来保持多态
为了保持类型安全,必要时会插入强制类型转换。
对于遗留代码,我们可以运用注解,如@suppressWarnings(“unchecked”)。来避免承诺过多。

限制与局限:
不能使用基本类型实例化类型参数
运行时类型检查只产生原始类型
不能创建参数化类型数组
不能实例化类型变量(注意Class类本身是泛型的)
不能构造泛型数组(若数组仅作为一个私有实例字段,可以将这个数组元素类型声明为擦除类型并强制类型转换)
泛型类的静态上下文中的类型无效
不能抛出或者捕获泛型类的实例
可以取消对检查型异常的检查
注意擦除后的冲突(为了支持擦除转换,我们需要施加一个限制:若两个接口类型是同一接口的不同参数化,一个类或类型变量就不能同时作为这两个接口类的子类)

泛型的继承
在反省中,即便两个类S与T 为S继承T,但定义为泛型,他们没有关系。
泛型类可以扩展和实现其他泛型类,例如可以ArrayList类实现List类,那么ArryList<类>可以转换为一个List<类>。

通配符类型:
使用通配符类型,可以允许参数类型发生变化。例如:
Pair< ? extends Employee>表示任意Pair类型,其类型参数都是Employee的子类,不过这不能调用方法。
通配符的超类限定:我们可以指定一个超类型限定,如:? extends Manager。次通配符限制为Manager的所有超类型,这可以为方法提供参数,但不能使用返回值。
即我们可以看出,超类限定的通配符允许写入一个泛型对象,而子类限定的通配符允许读取一个泛型对象。
无限定通配符:类<?>,可以有?.方法()。这个类型很脆弱,但对于简单操作会很有用。
通配符捕获:由于?不能作为一个类型,我们需要捕获时,我们只要在非常限定的情况下才是合法的。

反射和泛型:
泛型Class类:Class类是泛型的,其允许Class<?>方法的返回类型更加具有特定性。对其参数我们可以进行类型匹配,即调用方法(类型.class)。
由于擦除的类仍然保留原先泛型的微弱记忆,对一个泛型类对象我们无法确定其类型,可以通过反射API来确定:
泛型方法的名为T的类型名称
类型参数有一个子类限定,其自身也是一个泛型
这个限定类型有一个通配符参数
这个通配符参数有一个超类型限定
这个泛型方法有一个泛型数组参数

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值