首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java泛型PECS

Java泛型PECS
EN

Stack Overflow用户
提问于 2012-08-30 21:13:03
回答 3查看 861关注 0票数 4

我知道PECS是什么意思。

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

问题是,我如何知道它是消费者还是生产者?

这段代码是否也遵循"PECS“

代码语言:javascript
复制
public class Tree<T> {

    //List of branches for this tree
    private List<Tree<? super T>> branch = new ArrayList<Tree<? super T>>();
    public Tree(T t){ this.t = t; }
    public void addBranch(Tree< ? super T> src){ branch.add(src); }
    public Tree<? extends T> getBranch(int branchNum){
        return (Tree<? extends T>) branch.get(branchNum);
    }
    private T t;
}
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-08-30 21:21:50

您可以使用的一个很好的助记符是,将returns用于extends,将accepts用于super

因此,Tree<? extends T>读取Tree<? returns T>,这意味着您可以调用Tree中返回T的方法,但不能调用接受T作为参数类型的方法。

票数 3
EN

Stack Overflow用户

发布于 2012-08-30 21:16:04

  • Producer指的是方法的返回类型。
  • 使用者引用方法的参数类型。
票数 3
EN

Stack Overflow用户

发布于 2019-01-02 03:44:43

接下来的事情在我的脑海中清晰了一些。希望能对你有所帮助。

假设有一个未知类型X的元素列表,其中有一些逻辑,它显式地将列表扫描为类型X的元素(在构建列表之后)。让我们将此逻辑称为Logic1。

如果要将该列表作为T类型的对象进行扫描,则需要以某种形式从T派生X。否则,你就会有问题。因此,您的签名应该是:

代码语言:javascript
复制
void scan(List<? extends T>);

如果要将类型为T的对象添加到列表中,则需要从X派生T。否则上面提到的Logic1将会有问题。因此,您的签名应该是:

代码语言:javascript
复制
void add(List<? super T>);

请注意,据我所知,"scan“和"add”实际上都可以从列表中删除条目。我发现胸肌有点令人困惑。“生产者”和“消费者”来自于列表的角度。我不喜欢把list看作是可以执行逻辑的活动对象。我喜欢SEAS (扫描扩展和添加Supers)。就我的两分钱。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12197685

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档