美文网首页
java中的通配符 ? extends T 和 ? super

java中的通配符 ? extends T 和 ? super

作者: yxwithu | 来源:发表于2017-07-26 17:25 被阅读0次

    意义不同

    • ? extends T 表示上界是T
    • ? super T 表示下界是T

    用法不同

    以List为例
    List<? extends T> 表示List中存放的都是T或者T的子类型

    List<? extends Number> foo = new ArrayList<Number>();
    List<? extends Number> foo = new ArrayList<Integer>();
    List<? extends Number> foo = new ArrayList<Double>();

    foo确定了上界,所以可以从foo中读取到Number对象
    而不知道下界,所以foo可能是存储Number子类型的List,不能写入Number对象,同时不知道是哪一种子类型(Integer写Double或Double写Integer),所以写哪一种对象都是不合适的。

    List<? super T>表示List中存放的都是T或者T的父类型

    List<? super Integer> foo = new ArrayList<Integer>();
    List<? super Integer> foo = new ArrayList<Number>();
    List<? super Integer> foo = new ArrayList<Object>();

    foo确定了下界但是不知道上界,所以读取的话只能保证读到的是Object对象。
    而可以确定下界,所以可以向foo中写入Integer和Integer子类型对象。

    总结

    ? extends T 可以读取到T对象,而不能写入T对象和T的子对象
    ? super T 可以读取到Object对象,可以写入T对象和T的子对象
    若想既可以读取又可以写入,则不要用通配符,直接用T

    类似于消费者生产者模式
    ? extends T 只读, ? super T 只写入

    经典用法

    public class Collections { 
        public static <T> void copy(List<? super T> dest, List<? extends T> src) {
            for (int i = 0; i < src.size(); i++) 
                dest.set(i, src.get(i)); 
            } 
       }
    }
    

    参考文章

    1. https://stackoverflow.com/questions/4343202/difference-between-super-t-and-extends-t-in-java
    2. https://www.zhihu.com/question/20400700

    相关文章

      网友评论

          本文标题:java中的通配符 ? extends T 和 ? super

          本文链接:https://www.haomeiwen.com/subject/tedokxtx.html