版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u012292754/article/details/86635779
1 泛型
- 泛型就是参数化类型,使用广泛的类型;
- 接口中泛型只能用在方法中,不能使用在全局常量
1.1 起因
- 数据类型不明确
- 装入数据的类型都被当做 Object 对待,从而丢失自己的实际类型;
- 获取数据时往往需要转型,效率低,容易产生错误
1.2 作用
- 安全:在编译的时候检查类型安全
- 省心:所有的强制转换都是自动和隐式的,提高代码的重用率;
2 泛型擦除
- 在使用时没有指定具体的类型
- 子类继承时没有指定类型
2.1 处理
- 擦除后不进行类型检查
- 一旦擦除之后按 Object 接收
- 依然存在编译警告,加上 Object 可以去除,但是有些画蛇添足
public interface Comparable<T> {
}
//声明子类指定具体类型
class Comp implements Comparable<Integer>{
}
//擦除
class Comp1 implements Comparable{}
// 父类擦除,子类泛型
class Comp2<T> implements Comparable{}
// 子类泛型 >= 父类泛型
class Comp3<T> implements Comparable<T>{}
//父类泛型,子类擦除错误
3 通配符 ? extends super
- 泛型没有多态,要实现这个功能,要使用多态;
- 可以用在声明类型及声明方法参数上,不能用在声明类上;
?
可以接收泛型的任意类型,只能接收和输出,不能修改。(方法声明时参数无法正确知道具体类型,因此不能修改)? extends 泛型上限
? super 泛型下限
4 泛型与数组
- 没有泛型数组,不能创建泛型数组
- 可以只有声明,可以使用
?
5 JDK7 改进
- 声明时指定泛型,创建对象不用再次编写类型