zoukankan      html  css  js  c++  java
  • 泛型:上边界和通配符的使用以及对ArrayList的学习

     

    ---------------

     1 public class Wildcord {
     2     public static void main(String[] args) {
     3         /**
     4          * 类引用结构说明Person类,Student和Teacher类都是继承于Person, BadStudent类继承于Student类
     5          */
     6         List<? extends Person> list = new ArrayList<Person>();
     7         list.add(null);
     8 //         list.add(new Person("person1", 1));
     9         /*
    10          * 上面一行编译报错:原因是list是一个List的对象, 这个List里面的元素可以是任何继承于Person的实例,
    11          * 也就是我们规定了list的元素的上边界是Person, 但是Person有两个继承(况且还有Person这个父类在),
    12          * Student和Teacher,List要求内部元素必须一致, 所以这里java已经判断不出你到底需要什么元素了。
    13          */
    14         List<? extends BadStudent> list1 = new ArrayList<BadStudent>();
    15         list1.add(null);
    16 //        list1.add(new BadStudent("fusd", 23));
    17         /*
    18          * 上面一行编译仍然报错:原因是什么呢?这里我门几乎已经确定list1里面的元素是唯一一类了
    19          * 但是仍然不可以,这就是声明java本省就告诉我们不可以这样用,因为随时会有类可能继承自
    20          * BadStudent啊,具体源码我们没看过,但问题的原因应该就是这样
    21          */
    22         List<BadStudent> list2 = new ArrayList<BadStudent>();
    23         list2.add(null);
    24         list2.add(new BadStudent("fusd", 23));
    25         System.out.println(list2.size());
    26         /*
    27          *这里就正常了 
    28          */
    29         List<? extends Person> list3 = new ArrayList<Student>();
    30         List<? extends Person> list4 = new ArrayList<Teacher>();
    31         list3.add(null);
    32 //        list3.add(new Student("chenkh", 24));
    33         /*
    34          * 上面两个类似,在创建实例的时候没有任何问题,但是一旦涉及add操作,就会出问题
    35          */
    36         
    37         System.out.println(list3.size() + "	" + list4.size());
    38     }
    39 }
    40 
    41 class Person {
    42     String name;
    43     int age;
    44 
    45     public Person(String name, int age) {
    46         this.name = name;
    47         this.age = age;
    48     }
    49 }
    50 
    51 class Student extends Person {
    52     public Student(String name, int age) {
    53         super(name, age);
    54     }
    55 }

    瞬间发现,源码阅读涉及的东西真的好多。

    这里自己的总结真心乱。

    就这样吧。。。。。。。

    所以我们应该很好奇add方法到底做了什么限制,现在看源码!

    参考博客:Java中List实现之ArrayList(讲的非常详细,关于ArrayList的添加元素等源码分析,现在的新版本jdk源码有些改动,但是基本是这样的)

    所以最终我们并没有在源码中发现关于add方法有没有什么检查,所以暂时感觉add中检查这个元素是否可以作为添加项应该是编译器做的事情。

  • 相关阅读:
    RxJava系列7(最佳实践)
    异步编程 z
    利用WCF的双工通讯实现一个简单的心跳监控系统 z
    c#深拷贝
    MEF load plugin from directory
    C# 文件操作 把文件读取到字节数组
    code md5
    gridview转成EXCEL文件保存(多页)
    Getting started with SciPy for .NET
    IronPython调用C# DLL函数方法
  • 原文地址:https://www.cnblogs.com/chen-kh/p/6341695.html
Copyright © 2011-2022 走看看