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

 public class Wildcord {
public static void main(String[] args) {
/**
* 类引用结构说明Person类,Student和Teacher类都是继承于Person, BadStudent类继承于Student类
*/
List<? extends Person> list = new ArrayList<Person>();
list.add(null);
// list.add(new Person("person1", 1));
/*
* 上面一行编译报错:原因是list是一个List的对象, 这个List里面的元素可以是任何继承于Person的实例,
* 也就是我们规定了list的元素的上边界是Person, 但是Person有两个继承(况且还有Person这个父类在),
* Student和Teacher,List要求内部元素必须一致, 所以这里java已经判断不出你到底需要什么元素了。
*/
List<? extends BadStudent> list1 = new ArrayList<BadStudent>();
list1.add(null);
// list1.add(new BadStudent("fusd", 23));
/*
* 上面一行编译仍然报错:原因是什么呢?这里我门几乎已经确定list1里面的元素是唯一一类了
* 但是仍然不可以,这就是声明java本省就告诉我们不可以这样用,因为随时会有类可能继承自
* BadStudent啊,具体源码我们没看过,但问题的原因应该就是这样
*/
List<BadStudent> list2 = new ArrayList<BadStudent>();
list2.add(null);
list2.add(new BadStudent("fusd", 23));
System.out.println(list2.size());
/*
*这里就正常了
*/
List<? extends Person> list3 = new ArrayList<Student>();
List<? extends Person> list4 = new ArrayList<Teacher>();
list3.add(null);
// list3.add(new Student("chenkh", 24));
/*
* 上面两个类似,在创建实例的时候没有任何问题,但是一旦涉及add操作,就会出问题
*/ System.out.println(list3.size() + "\t" + list4.size());
}
} class Person {
String name;
int age; public Person(String name, int age) {
this.name = name;
this.age = age;
}
} class Student extends Person {
public Student(String name, int age) {
super(name, age);
}
}

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

这里自己的总结真心乱。

就这样吧。。。。。。。

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

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

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

泛型:上边界和通配符的使用以及对ArrayList的学习的更多相关文章

  1. Java中的泛型 (上) - 基本概念和原理

    本节我们主要来介绍泛型的基本概念和原理 后续章节我们会介绍各种容器类,容器类可以说是日常程序开发中天天用到的,没有容器类,难以想象能开发什么真正有用的程序.而容器类是基于泛型的,不理解泛型,我们就难以 ...

  2. Java编程的逻辑 (35) - 泛型 (上) - 基本概念和原理

    本系列文章经补充和完善,已修订整理成书<Java编程的逻辑>,由机械工业出版社华章分社出版,于2018年1月上市热销,读者好评如潮!各大网店和书店有售,欢迎购买,京东自营链接:http:/ ...

  3. Java泛型之上、下界通配符的理解(适合初学)

    泛型的由来 为什么需要泛型   Java的数据类型一般都是在定义时就需要确定,这种强制的好处就是类型安全,不会出现像弄一个ClassCastException的数据给jvm,数据安全那么执行的clas ...

  4. Java泛型解析(02):通配符限定

    Java泛型解析(02):通配符限定      考虑一个这种场景.计算数组中的最大元素. [code01] public class ArrayUtil { public static <T&g ...

  5. 【Java心得总结三】Java泛型上——初识泛型

    一.函数参数与泛型比较 泛型(generics),从字面的意思理解就是泛化的类型,即参数化类型.泛型的作用是什么,这里与函数参数做一个比较: 无参数的函数: public int[] newIntAr ...

  6. java_泛型,设置类型通配符的上限

    package ming; import java.util.ArrayList; import java.util.Collection; import java.util.List; class ...

  7. JAVA泛型之<? extends T>:(通配符上限)和<? super T>(通配符下限)

    一.通配符上限和通配符下限接受的类型 通配符上限:<? extends T> 通配符下限:<? super T> 以下代码是测试结果,注释为解释说明 package xayd. ...

  8. 泛型与非泛型集合类的区别及使用例程,包括ArrayList,Hashtable,List<T>,Dictionary<Tkey,Tvalue>,SortedList<Tkey,Tvalue>,Queue<T>,Stack<T>等

    泛型与非泛型集合类在C#程序中是非常重要的一个基础概念,这里列一个表来进行对比: 非泛型集合类 泛型集合类 描述 ArrayList List<T> 表示具有动态大小的对象数组 Hasht ...

  9. 上四条只是我目前总结菜鸟们在学习FPGA时所最容易跑偏的地

    长期以来很多新入群的菜鸟们总 是在重复的问一些非常简单但是又让新手困惑不解的问题.作为管理员经常要给这些菜鸟们普及基础知识,但是非常不幸的是很多菜鸟怀着一种浮躁的心态来学习 FPGA,总是急于求成. ...

随机推荐

  1. java中多线程中测试某个条件的变化用 if 还是用 while?

    最近在研究wait和notify方法,发现有个地方要注意,但是网上又说得不是很明白的地方,就是经典的生产者和消费模式,使用wait和notify实现,判断list是否为空的这个为什么要用while而不 ...

  2. 44个 Javascript 变态题解析

    原题来自: http://javascript-puzzlers.herokuapp.com/ 读者可以先去做一下感受感受. 当初笔者的成绩是 21/44... 当初笔者做这套题的时候不仅怀疑智商, ...

  3. win8及以上2012 R2,virtualbox 5.0.20安装centOS6以上各种注意事项

    问题: Virtul Box 安装增强功能时, 未能加载虚拟光盘VBoxGuestAdditions.iso 1.先下载适合win8及2012 R2以上系统适用的virtualbox最新版5.0.20 ...

  4. yii1的笔记

    $sql = 'SELECT * FROM to8to_worker_item limit 10'; $res = Yii::app()->db->createCommand($sql)- ...

  5. C#语言-08.序列化与反序列化

    a. 序列化:是将对象的状态存储到特定存储介质中的过程 i. 语法:public void Serialize(序列化过程的文件流,保存的对象) b. 返序列化:是从特定存储介质中将数据重新构建对象的 ...

  6. Java API 之 正则表达式

    一.基本概念 在项目中我们经常性做的一件事是“匹配”字符串 比如: 1.我们要验证用户输入的手机号是否合法? 2.验证设置的密码是否符合规则? 3.或者替换指定字符串中的一些内容. 这么一看,似乎正则 ...

  7. 嵌套Golang对象的初始化

      比如有这样一个对象: type ProductConfig struct {     Site map[string]string } 对应的初始化可以如下写: var pc ProductCon ...

  8. oauth2.0授权码模式详解

    授权码模式原理 授权码模式(authorization code)是功能最完整.流程最严密的授权模式.它的特点就是通过客户端的后台服务器,与"服务提供商"的认证服务器进行互动. 它 ...

  9. Windows下的代码注入

    木马和病毒的好坏很大程度上取决于它的隐蔽性,木马和病毒本质上也是在执行程序代码,如果采用独立进程的方式需要考虑隐藏进程否则很容易被发现,在编写这类程序的时候可以考虑将代码注入到其他进程中,借用其他进程 ...

  10. crontab 切割日志

    cutlog.sh #!/bin/sh source /etc/profile D=$(date "+%Y%m%d%H%M%S") mv "/usr/local/Cell ...