------- android培训、java培训、期待与您交流! ----------
泛型:
它是jdk1.5版本,出现的技术,是一个安全机制。
泛型技术的由来:
集合中可以存储任意类型对象,但是在取出时,如果要使用具体对象的特有方法时,需要进行向下转型,
如果存储的对象类型不一致,在转型过程中就会出现ClassCastException异常。
在jdk1.5以后就有了解决方案,就是泛型技术。
解决方案就是,在存储元素时,就不允许存储不同类型的元素。
存储了就编译失败。
所以就需要在存储元素时,在容器上明确具体的元素类型,这其实就和数组定义很像。
好处:
1,将运行时期的classcastException异常转移到了编译时期,进行检查,并以编译失败来体现。
这样有利于程序员尽早解决问题。
2,避免了向下转型(强转的)麻烦。
什么时候写泛型呢?
先简单理解:只要在使用类或者接口时,该类或者接口在api文档描述时都带着<>就需要在使用时,定义泛型。
其实:泛型无非就是通过<>定义了一个形式参数,专门用于接收具体的引用类型。
在使用时,一定要传递对应的实际参数类型。
集合中泛型的应用特别多见。
没有使用特有方法的不需要强转的,正因为要使用特有方法所以就要加泛型。
泛型的擦除:
泛型技术是用于编译时期的技术,这个技术是编译器里面融合进来了,生成后的class文件是不带泛型的。编译器会按照<>
中的指定的类型对元素进行检查,检查不匹配,就编译失败,匹配,就编译通过,通过后生产的class文件中是没有泛型的。
泛型的补偿:
运行时,可以根据具体的元素对象获取其具体的类型,并用该类型对元素进行自动转换。
泛型对于程序的设计也有一定优化动作。
当一个类要操作的引用数据类型不确定的时候,可以将该类型定义一个形参。
用到的这类时,有使用者来通过传递类型参数的形式,来确定要操作的具体的、
对象类型。
意味着:在定义这个类时候,需要在类上定义形参,用于接收具体的类型实参。
这就是泛型定义在类上, 这就是泛型类。
什么时候使用泛型类呢?只要类中操作的引用数据类型不确定的时候,就可以定义泛型类。
有了泛型类,省去了曾经的强转和类型转换异常的麻烦。
泛型除了 可以定义在类上 也可以定义在方法上。
定义方法的是 在public加泛型。
静态方法不可以访问类上定义的泛型,如果需要泛型,该泛型只能定义在方法上。 静态的泛型定义在返回值前面,类型的后面。
泛型也可以定义在接口上,只要类型不确定都可以写泛型。
实现接口时,明确具体的类型。
实现接口时候,也不明确具体的类型。
通配符的应用:
集合中使用的注意特点:保证两边一致。简单的定义方式就是保证两边类型一致,但是也有其他情况。
泛型的通配符:? 类型不匹配时候用。当操作不同容器中类型都不确定的时候,而且使用的都是元素的从Object类中继承的方法。
这时泛型就用通配符?来表示即可。
泛型的限定:
明确具体类型代表一个类型,明确?代表所有类型,
能不能对操作的类型限制在一个范围之内呢?
比如:定义一个功能,只操作person类或者person子类型。这时可以用?继承 E接收e类型或者E的子类型。
存储时候就用这种方式。这就是上限。
下限的表示形式: ? super E;接受E类型或者E的父类型。
什么时候使用上限呢? 一般情况下,只要是往容器中添加元素时,使用上限 ? extends E
什么时候使用下限呢?一般情况下,只要是从容器中取出元素时,使用下限 ? super E