本质
泛型的本质是为了参数化类型(在不创建新的类型的情况下,通过泛型指定的不同类型来控制形参具体限制的类型)。也就是说在泛型使用过程中,操作的数据类型被指定为一个参数,这种参数类型可以用在类、接口和方法中,分别被称为泛型类、泛型接口、泛型方法。
什么时候定义泛型类:
当类中要操作的引用数据类型不确定的时候。
早期定义Object来完成扩展。现在定义泛型来完成扩展。
Generic<?> obj
类型通配符一般是使用?代替具体的类型实参,注意了,此处’?’是类型实参,而不是类型形参 。重要说三遍!此处’?’是类型实参,而不是类型形参 ! 此处’?’是类型实参,而不是类型形参 !再直白点的意思就是,此处的?和Number、String、Integer一样都是一种实际的类型,可以把?看成所有类型的父类。是一种真实的类型。
可以解决当具体类型不确定的时候,这个通配符就是 ? ;当操作类型时,不需要使用类型的具体功能时,只使用Object类中的功能。那么可以用 ? 通配符来表未知类型。
泛型的意义:
- 自动进行类型的检查(并不是进行类型的替换,只是对类型进行检查,属于编译期行为)
- 自动进行类型的强制类型转换
- 泛型会在编译期间采取擦除机制,擦成Object,(并不是发生替换)
坑:
- 简单类型不可做泛型参数,应用包装类
- 不能创建一个确切的泛型类型的数组
List[] ls = new ArrayList[10];
总的来说:
- 泛型是为了解决某些容器、算法等代码的通用性而引入,并且能在编译期间做类型检查。
- 泛型利用的是 Object 是所有类的祖先类,并且父类的引用可以指向子类对象的特定而工作
- 泛型是一种编译期间的机制,即 MyArrayList 和 MyArrayList 在运行期间是一个类型。
- 泛型是 java 中的一种合法语法,标志就是尖括号 <>
- 泛型不参与类型的组成
注:
静态方法不可以访问类上定义的泛型。
如果静态方法操作的应用数据类型不确定,可以将泛型定义在方法上。