【问题标题】:regarding PECS java generics关于PECS java泛型
【发布时间】:2010-12-26 23:55:05
【问题描述】:

阅读 Java Essentials,第 2 版,有一条称为 PECS 的规则用于方法参数中的类型安全。如果它产生你扩展,消耗你使用超级。对不起,如果我定义错了,因为我不明白。

谁能解释一下 Joshua Bloch 所说的生产者/消费者是什么?

【问题讨论】:

    标签: java generics


    【解决方案1】:

    查看此pdf,其中包含一系列幻灯片(搜索 PECS):

    泛型类型是不变的

    • 也就是说,List<String> 不是List<Object> 的子类型
    • 有利于编译时类型安全,但不够灵活

    有界通配符类型提供额外的 API 灵活性

    List<String>List<? extends Object> 的子类型
    List<Object>List<? super String> 的子类型

    所以

    PECS生产者扩展,消费者超级

    • 将Foo<? extends T> 用作T 生产者
    • 使用Foo<? super T> 作为T 消费者

    仅适用于输入参数(不要使用通配符类型作为返回类型)。

    假设您想向 Stack 添加批量方法:

    void pushAll(Collection<? extends E> src);
    //src is an E producer
    
    void popAll(Collection<? super E> dst);
    // dst is an E consumer
    

    【讨论】:

    • @Jeroen Thx 用于格式化。我只是剪切并粘贴了参考 - 它看起来没有改变
    • 那么为什么 public static void fill(List super T> list, T obj) 使用 super 虽然它正在消耗它tutorialspoint.com/java/util/collections_fill.htm
    • “不要使用通配符类型作为返回类型。”除非您需要类似于getClass() 的方法(实际上它不仅仅是在其声明中具有通配符返回类型,Class&lt;?&gt; [相当于Class&lt;? extends Object&gt;];它返回一个Class&lt;? extends [whatever class getClass() was called in]&gt;)。 ...不过,我想这并不适用于将泛型与集合一起使用。
    • 链接没有映射到 pdf :(
    【解决方案2】:

    当一个方法读取/迭代集合中的元素时,它是消费者,当它向集合做广告时,它是生产者。

    【讨论】:

      猜你喜欢
      • 2012-08-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-21
      • 1970-01-01
      • 1970-01-01
      • 2015-11-14
      相关资源
      最近更新 更多