简单来回顾一下类型擦除,看下面这段代码。
public class Cmower {
public static void method(ArrayList<String> list) {
System.out.println("Arraylist<String> list");
}
public static void method(ArrayList<Date> list) {
System.out.println("Arraylist<Date> list");
}
}
在浅层的意识上,我们会认为 ArrayList<String> list 和 ArrayList<Date> list 是两种不同的类型,因为 String 和 Date 是不同的类。
但由于类型擦除的原因,以上代码是不会编译通过的——编译器会提示一个错误:
'method(ArrayList<String>)' clashes with 'method(ArrayList<Date>)'; both methods have same erasure
也就是说,两个 method() 方法经过类型擦除后的方法签名是完全相同的,Java 是不允许这样做的。
也就是说,按照我们的假设:如果 Java 能够实现真正意义上的泛型,两个 method()方法是可以同时存在的,就好像方法重载一样。
public class Cmower {
public static void method(String list) {
}
public static void method(Date list) {
}
}
为什么 Java 不能实现真正意义上的泛型呢?背后的原因是什么?
第一,兼容性
Java 在 2004 年已经积累了较为丰富的生态,如果把现有的类修改为泛型类,需要让所有的用户重新修改源代码并且编译,这就会导致 Java 1.4 之前打下的江山可能会完全覆灭。
想象一下,你的代码原来运行的好好的,就因为 JDK 的升级,导致所有的源代码都无法编译通过并且无法运行,是不是会非常痛苦&#