Java隐藏技-最理想假设

简介: Java隐藏技-最理想假设

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类才不会报错,


image.png

比如


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());


目录
相关文章
|
26天前
|
存储 缓存 Java
java枚举消除冗余代码问题之findByName和findByValue方法工作时的问题如何解决
java枚举消除冗余代码问题之findByName和findByValue方法工作时的问题如何解决
|
3月前
|
JSON Java Apache
干货文:如何在 Java 中制作对象的深层副本
干货文:如何在 Java 中制作对象的深层副本
45 1
|
9月前
|
数据采集 自然语言处理 Java
Java新提案,最终还是靠近C#了
Java新提案,最终还是靠近C#了
42 0
Java新提案,最终还是靠近C#了
|
9月前
|
Java UED
Java设计一个简单的能保留计算过程的计算器
Java设计一个简单的能保留计算过程的计算器
|
算法 Java
找到 K 个最接近的元素(java,算法)
找到 K 个最接近的元素(java,算法)
105 0
|
存储 SQL XML
好用!期待已久的文本块功能究竟如何在 Java 13 中发挥作用?
这可能是很多朋友目前的真实情况。说实话,Java “每半年发布一个新版本”的节奏确实快了点。但不管怎样,新技术、新特性还是值得我们学一学。
203 0
好用!期待已久的文本块功能究竟如何在 Java 13 中发挥作用?
|
JavaScript 前端开发 Java
java中的类也不是很难哦(在更新中 加油加油)
java中的类也不是很难哦(在更新中 加油加油)
java中的类也不是很难哦(在更新中 加油加油)
|
Oracle Java 关系型数据库
关于Java两点需要更新的知识
关于Java两点需要更新的知识
关于Java两点需要更新的知识
一张图搞定java类之间的6种关系,以后再也不怕画UML图了
java的类之间的关系:泛化、依赖、关联、实现、聚合、组合
一张图搞定java类之间的6种关系,以后再也不怕画UML图了
|
算法 Java
Java隐藏技-混淆序列
Java隐藏技-混淆序列
133 0