<? extends E> 和<? super E>的使用   <? extends E>的使用 Item 26 这是堆栈的公有API: public class Stack<E>{      public Stack();    public void push(E e);    public E pop();    public boolean isEmpty();      public void pushAll(Iterable<E> s…
参数化类型是不可变的.对两个不同类型T1和T2而言,List<T1>与List<T2>没有父子类型关系. 考虑: public class Stack<E> { public Stack(); public void push(E e); public E pop(); public boolean isEmpty(); } 假设增加一个方法,按顺序将一系列的元素放到堆栈中: public void pushAll(Iterable<E> src) { fo…
如第二十五条所述,参数化类型是不可变的.类型Type1和Type2而言,不管Type1与Type2的关系,List<Type1>既不是List<Type2>的子类型,也不是也不是它的超类型.那么按理来说我们声明了 一个List<Object>的变量,应该只能把Object类型的对象放入其中,但是我们知道可以把Object的子类放入其中. 同样我们声明了一个List<Number>的变量,不仅仅可以把Number类型的对象放入其中,也可以把Integer和Lo…
Tips <Effective Java, Third Edition>一书英文版已经出版,这本书的第二版想必很多人都读过,号称Java四大名著之一,不过第二版2009年出版,到现在已经将近8年的时间,但随着Java 6,7,8,甚至9的发布,Java语言发生了深刻的变化. 在这里第一时间翻译成中文版.供大家学习分享之用. 31. 使用限定通配符来增加API的灵活性 如条目 28所述,参数化类型是不变的.换句话说,对于任何两个不同类型的Type1和Type,List <Type1>…
有时候,我们需要的灵活性要比不可变类型所能提供的更多.所以针对一些通用性的方法,通常用泛型代替固定的数据类型,特别是当你要将某个方法打包成Jar的时候. 结合之前的例子,我们增加尝试用有限制的通配符类型来加大方法的灵活性 public class Stack<E> { public void pushAll(Iterable<? entends E> src){ for(E e:src){ //push为一个将元素加入到数组中的方法 push(e); } } } 这个方法按顺序将一…
在你的 API 中使用通配符类型,虽然棘手,但使得 API 更加灵活. 如果编写一个将被广泛使用的类库,正确使用通配符类型应该被认为是强制性的. 记住基本规则: producer-extends, consumer-super(PECS). 还要记住,所有 Comparable 和 Comparator 都是消费者.…
利用 Django REST framework 编写 RESTful API Updateat 2015/12/3: 增加 filter 最近在玩 Django,不得不说 rest_framework 真乃一大神器,可以轻易的甚至自动化的搞定很多事情,比如: 自动生成符合 RESTful 规范的 API 支持 OPTION.HEAD.POST.GET.PATCH.PUT.DELETE 根据 Content-Type 来动态的返回数据类型(如 text.json) 生成 browserable…
Atitit.提升api兼容性的方法 v3 q326 1. Atitit.兼容性的“一加三”策略1 2. 2. 扩展表模式1 3. 3. 同时运行模式1 3.1. 3.1. 完美的后向兼容性2 3.2. 3.2. 虚拟机模式2 3.3. 3.3. 版本兼容性模式2 4. 4. 向前兼容(为升级预留足够余地)3 5. 5. “向前兼容”理念3 6. 6. 专门处理的软件列表3 7. 新api  vs  修改旧的api4 8. Threadlocal4 9. ref5 1. Atitit.兼容性的“…
目前已经使用Vertx已经一年多了,虽然没有太多的造诣,但也已在项目中推广了下:从最初的vertx搭建web服务,到项目上线运营,还算比较稳定.再到后来尝试搭建基于vertx的分布式服务,一路下来也积累了些经验,在这里也从几个方面来聊一聊. 一.初识Vertx 我们当时需要改造一个项目,在技术选型上有不同的意见:朋友推荐让我们尝试使用vertx来构建我们的服务: 主要出于以下几点: 1. 我们趋向于前后端分离,服务端主要提供API服务,前端采用Node.js+vue来构建:而Vertx体现了他的…
假设你正在操作一个Rectangle类.每个矩形可以通过左上角的点和右下角的点来表示.为了保证一个Rectangle对象尽可能小,你可能决定不把定义矩形范围的点存储在Rectangle类中,而是把它放入一个辅助结构体中,Rectangle中声明一个指向它的指针就可以了: class Point { // class for representing points public: Point(int x, int y); ... void setX(int newVal); void setY(i…