泛型解决什么问题?
集合容器类,在定义阶段不确定实际存储什么类型的对象,在jdk1.5之前只能将类型设计为Object类型,但是这意味着“误操作”、以及取出时要强制转型等问题。
泛型解决方案:为了更好解决诸如容器类,“虽然管理元素的流程是确定的,但是类型不确定”的问题。定义接口、类时,将类型设计为一个参数(或者说标识),比如、等就是类型参数,即泛型;当实例化该类时,才指明类型参数,这叫泛型擦除。
简单说泛型的概念: 定义泛型、泛型擦除。
1. 在定义类、接口时: 将具体的类型替换为T、V、K、E等标识,就叫泛型。
public class ArrayList<E> extends AbstractList<E>
implements List<E>, RandomAccess, Cloneable, java.io.Serializable
{
...
}
2. 使用类、接口时: 使用具体的类型,比如String ,来指明先前的标识,这叫泛型擦除。
List<String> list = new ArrayList<String>(); // 注:由于类型推断的存在,所以右边可以写new ArrayList<>();
3. 另外,也有泛型方法
public V add(K key,V value){
return this.dic.put(key,value);
}
泛型概念:所谓泛型,就是允许在定义类、接口时通过一个标识表示类中某个属性的类型或者是某个方法的返
回值及参数类型。这个类型参数将在使用时(例如,继承或实现这个接口,用这个类型声明变量、
创建对象时确定(即传入实际的类型参数,也称为类型实参)。
泛型的类型擦除:
首先,java的泛型仅编译器存在,可作为类型检测等机制。而运行期并不存在泛型,比如编译器有ArrayList和ArrayList两种类型,但在运行期的类型统一为ArrayList,这叫类型擦除, 当然也有限制的类型擦除。
在运行期内:
- 无限制通配符,诸如List, 在类型擦除后,会被直接替换为List