zoukankan      html  css  js  c++  java
  • JavaSE 通配符的使用一二


    --------------------------关于泛型之中装了子父类之后,List能否再相互赋值一事--------------------------
    假设
    List<Object> list1 = null;
    List<String> list2 = new ArrayList<String>();
    请注意这两者是不存在子父类关系的,当装入List的那一刻,这两者的关系变味了并列关系
    证明如下
      list1=list2;

    那么list1这个List<Object>类型的指针就能指向List<String>类型的List了
    同时因为list1是List<Object>类型的指针,所以能够写list1.add(123),这个时候123就被添加到List<String>中,编译报错,因为添加了不同数据类型的数据
    list2=list1也是不可以的,二者不存在子父类关系,不能胡乱将两个不同类型的数据相互赋值,就像是把时间类赋给了字符串变量,牛头不对马嘴。


    复习多态:
    Object[] arr1=null;
    string[] arr2=null;
    arr1=arr2;//可以,这里是多态

    ------------------泛型的引进:如何解决不再有任何关系的List之间如何简化代码调用供同方法一事------------------

    拥有相类似的方法但是不能共同调用怎么办?

    public void show(List<Object> list){}//写法局限性很大,不建议
    public void show1(List<String> list){}

    因为List<Object>和List<String>不存在子父类的关系,所以这两者的对象在调用show()的时候必须要写两个show方法别分供二者使用,
    所以Java发明了通配符(?),通配符的作用很简单,就是当二者的父类
    一旦有了通配符?之后,二者所要分别调用的show1和show就可以一律改写成为:

    public void show(List<?> list){}

    list<?>成为List<String>和List<Object>的父类,什么都可以往通配符里面装

    注意:
    以下添加的写法是错误的,用过通配符的泛型不能向其内部添加数据(除了null之外)
    List<?> list = null;
    list.add(某个变量);//在上面一行代码的约束下:除了null以外,其他对象都不能通过add往里面添加
    list.get(int index);//能够通过get读出变量,返回类型为Object;但是不能写!也就是add。


    --------------------------关于通配符搭配extends和super的使用--------------------------

    当通配符配合extends使用的时候
    例如:
    List<? extends Person> list = null;
    这个地方只能找范围小于等于Person类来赋给list
    例如存在一个
    class Student extends Person{};
    class Human extends Student{};
    List<Student> list1 = null;
    List<Human> list2 = null;
    List<Object> list3 = null;
    则可以写:
    list=list1;
    list=list2;
    不可以写:
    list=list3;//因为Object已经超过了通配符可以接住的范围了

    当通配符配合super使用的时候
    例如:
    List<? super Person> list = null;
    那么通配符能接住的范围就是大于等于Person了,即当List当中装着Person、Person的父类等,或者Object的时候,就能编译通过
    class Student extends Person{};
    List<Person> list1 = null;
    List<Object> list2 = null;
    List<Student> list3 = null;
    list = list1;//成立
    list = list2;//成立
    list = list3;//错误,超出通配符能接受度的下限
  • 相关阅读:
    手势
    ios提示框,自动消失
    UITableView
    UIAlertView
    微信公众号主页链接
    试用avalon2.0
    VirtualPathProvider的使用
    代码暂存 [获取二唯码并识别保存二唯码]
    提交数据url太长导致提交失败
    打通前后台
  • 原文地址:https://www.cnblogs.com/oldfish123/p/14592951.html
Copyright © 2011-2022 走看看