我知道由于类型擦除,所有通用参数在编译期间都会被删除,所以如果我们有以下方法
public void addToList(List<Orange> list){}
public void addToList(List<Apple> list){}
在类型擦除之后,他们最终都会看起来像这样。
public void addToList(List list){}
在你考虑到编译器不允许你这样做之前,这一切都是可以理解的
public static void addToList(List<Orange> list){}
public static void main(String args[]){
List<Apple> list = new Arraylist<>();
addToList(list); //Error: passing a list of apples to a list of oranges
}
如果我们尝试做这样的事情,编译器就不会让我们,这意味着编译器知道我们列表的泛型类型。所以我很困惑为什么编译器更愿意向我们抛出错误,但假装它不能分辨两个重载方法之间的区别?