在集合中,我们经常会使用到泛型,但是之前对泛型的机制不懂,学习了一下,做下笔记。
首先我们来看下集合使用泛型的例子
public static void main(String[] args) {
List<String> list = new ArrayList<String>();
list.add("hi");
list.add("hello");
System.out.println(list.get(0));
System.out.println(list.get(1));
}
这段代码编译后会怎么样?看一下,反编译后的代码
public static void main(String[] args)
{
List list = new ArrayList();
list.add("hi");
list.add("hello");
System.out.println((String)list.get(0));
System.out.println((String)list.get(1));
}
反编译后的代码里已经没有泛型,被替换为原来的类型,并且在相应读取数据的地方,插入了强制转换代码。所以运行时,ArrayList<Integer>与ArrayList<String>就是相同的类型。泛型在java中,实际上是一颗语法糖,实现方式为类型擦除,是一种伪泛型。
我们来看以下两个方法
public class GenericTest {
public void aMethod(List<Integer> list){
System.out.println("List<Integer>");
}
public void aMethod(List<String> list){
System.out.println("List<String>");
}
}
会怎么样?编译不通过,因为类型擦除,这两个方法的参数相同,签名是一样的。