前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Java杂谈之Arrays.asList()最理想假设

Java杂谈之Arrays.asList()最理想假设

作者头像
你呀不牛
发布2021-05-28 11:10:12
2560
发布2021-05-28 11:10:12
举报
文章被收录于专栏:我要变牛

Java编程思想一书中有类似的一段描述:观察main函数中list几会编译不通过

代码语言:javascript
复制
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类才不会报错,

在这里插入图片描述

比如 Listlist5 = Arrays.asList(new GrandSon1, new GrandSon2());

由于GrandSon1 和 GrandSon2类最近的共同父类是Son1,所以编译不过 Listlist7 = Arrays.asList(new GrandSon1(), new GrandSon3());

而GrandSon1 和 GrandSon3类继承树上最近的共同父类是Father类,所以编译可以通过,

那么,问题来了,为什么不是Father类就会出错呢???

这是因为加入泛型后 List 虽然是 ArrayList的父类,

但是 List并不是ArrayList的父类,

集合与数组不同 ,数组Father[]仍然是Son[]的父类,

那么,如果就是想加入两个没有最近父类是声明类型的怎么办呢?

这就要把“=”两边类型信息设置统一,

解决方法一: Arrays.asList()生成的ArrayList不能添加,换成普通的ArrayList后,再向集合里面添加元素,

代码语言:javascript
复制
List<Father>list8 = new ArrayList<Father>;
list8.add(new GrandSon1());
list8.add(new GransSon2());
//Collections.addAll(new GrandSon1(), new GrandSon2());

解决方法二:利用通配符把扩展左边类型

代码语言:javascript
复制
List<?extends Father>list9 = Arrays.asList(new GrandSon1, new GrandSon2());

解决方法三:利用泛型信息,告诉编译器右边的实际目标的类型:

代码语言:javascript
复制
List<Father>list10= Arrays.<Father>asList(new GrandSon1, new GrandSon2());
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-04-02,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 你呀不牛 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档