泛型设计的初衷就是为了减少手动的类型转换工作
===为什么需要泛型?没有泛型之前通用程序是如何设计的呢?
泛型的目的就是减少强制类型转换出现的错误。
如果没有泛型,比如一个集合就存法了两种元素Integer整数类型和字符串类型String类型。因为所有对象都是Object类的子类,这个时候你取出一个元素,你以为他是整数类型你强制类型转换,但是他是字符串类型这个时候就会抛异常ClassCast类型转换异常。而且这种异常是运行时异常还不是编译时异常,所以是我们不愿意看到的。
所以引入泛型,由编译器在编译时期进行强制类型转换,避免我们手动类型转换可能出现的错误,比如刚刚的集合如果泛型是整数类型,添加string类型的话编译的时候就会出错。
===泛型是什么时候开始工作的?解释一下java泛型擦除
编译的时候进行工作,编译的时候看到类型参数进行泛型擦除,插入强制类型转换的指令。
定义两个ArrayList<String>和ArrayList<Integer>类型的集合arrayString和arrayInteger,当比较两个集合的类型的时候会发现类型是一样的。
arrayString.getClass()==arrayInteger.getClass()
在编译期的时候会发生类型擦除,都会变成ArrayList类型。原始类型就是在类型擦除之后在字节码中真正的类型。