---------------
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中检查这个元素是否可以作为添加项应该是编译器做的事情。