这是我参与8月更文挑战的第1天,活动详情查看:8月更文挑战
Java编程思想一书中有类似的一段描述:观察main函数中list几会编译不通过
class Father{
}
class Son1 extends Father{
}
class Son2 extends Father{
}
class GrandSon1 extends Son1{
}
class GrandSon2 extends Son1{
}
class GrandSon3 extends Son2{
}
public class AsListInteface{
public static void main(Sting []args){
List<Father>list1 = Arrays.asList(new Father(), newSon1());
List<Father>list2 = Arrays.asList(new Son1());
List<Father>list3 = Arrays.asList(new Son1, new Son2());
List<Father>list4 = Arrays.asList(new GrandSon1());
List<Father>list5 = Arrays.asList(new GrandSon1, new GrandSon2());
List<Father>list6 = Arrays.asList(new GrandSon2(), new GrandSon3());
List<Father>list7 = Arrays.asList(new GrandSon1(), new GrandSon3());
}
}
复制代码
由于Arrays.asList()方法会对所产生的List的类型做出最理想的假设,
也就是说,从继承树角度看,出入多个参数时,参数的类型的最近共同
父类(包括本身类型)必须是Father类才不会报错,

比如
List<Father>list5 = Arrays.asList(new GrandSon1, new GrandSon2());
复制代码
由于GrandSon1 和 GrandSon2类最近的共同父类是Son1,所以编译不过
List<Father>list7 = Arrays.asList(new GrandSon1(), new GrandSon3());
复制代码
而GrandSon1 和 GrandSon3类继承树上最近的共同父类是Father类,所以编译可以通过,
那么,问题来了,为什么不是Father类就会出错呢???
这是因为加入泛型后 List 虽然是 ArrayList的父类,
但是 List并不是ArrayList的父类,
集合与数组不同 ,数组Father[]仍然是Son[]的父类,
那么,如果就是想加入两个没有最近父类是声明类型的怎么办呢?
这就要把“=”两边类型信息设置统一,
解决方法一: Arrays.asList()生成的ArrayList不能添加,换成普通的ArrayList后,再向集合里面添加元素,
List<Father>list8 = new ArrayList<Father>;
list8.add(new GrandSon1());
list8.add(new GransSon2());
//Collections.addAll(new GrandSon1(), new GrandSon2());
复制代码
解决方法二:利用通配符把扩展左边类型
List<?extends Father>list9 = Arrays.asList(new GrandSon1, new GrandSon2());
复制代码
解决方法三:利用泛型信息,告诉编译器右边的实际目标的类型:
List<Father>list10= Arrays.<Father>asList(new GrandSon1, new GrandSon2());
复制代码
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END




















![[桜井宁宁]COS和泉纱雾超可爱写真福利集-一一网](https://www.proyy.com/skycj/data/images/2020-12-13/4d3cf227a85d7e79f5d6b4efb6bde3e8.jpg)

![[桜井宁宁] 爆乳奶牛少女cos写真-一一网](https://www.proyy.com/skycj/data/images/2020-12-13/d40483e126fcf567894e89c65eaca655.jpg)