zoukankan      html  css  js  c++  java
  • 限定通配符

        public void pushAll(Iterable<E> src) {
            for (E e : src) {
                //....
            }
        }
    

    Integer是Number的子類,但是這卻編譯不過

        Stack<Number> numberStack = new Stack<>();
        Iterable<Integer> integers = ...;
        numberStack.pushAll(integers)
    

    我們需要將pushAll給改動一下

        public void pushAll(Iterable<? extends E> src) {
            for (E e : src) {
                //....
            }
        }
    

    這就比較合適了

    如果需要區分生產者和消費者的時候,通配符的作用就很大了,這讓我們的編譯很乾淨。 PECS 代表: producer-extends,consumer-super。

    舉個例子,如果是push方法,我們生成Stack中的元素,所以<? extends E>。如果是pop方法,我們消耗Stack中的元素,<? super E>。這是一種很簡單的面向對象的思維。

    但是如果同時是消費和生產著,千萬不要用通配符,你需要特定一個清晰的類型匹配。

    一個好玩的東西

    public static <T extends Comparable<T>> T max(List<T> list)
    

    這個該怎麽改呢

    這個樣子,理解一下。

    public static <T extends Comparable<? super T>> max(List<? extends T> list)
    

    PECS,所有 Comparable 和 Comparator 都是消费者。雖然像一個口訣,但是千萬不要背。

    一个没有高级趣味的人。 email:hushui502@gmail.com
  • 相关阅读:
    JS中的instanceof和typeof
    JSONP跨域的原理解析
    svn add 忽略node_modules
    淘宝flexible.js的使用
    最简单的方式实现rem布局
    关于不同retina的布局
    es5实现es6方法
    Webpack loaderUtils.parseQuery()
    npm操作命令
    阿里云服务器配置https
  • 原文地址:https://www.cnblogs.com/CherryTab/p/11954648.html
Copyright © 2011-2022 走看看