4

我知道PECS是什么意思。

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

问题是我怎么知道它是消费者还是生产者?

此代码是否也遵循“PECS”

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;
}
4

3 回答 3

3
  • 生产者是指方法的返回类型。
  • 消费者是指方法的参数类型。
于 2012-08-30T13:16:03.683 回答
3

您可以使用的一个很好的助记符是想象returnsforextendsacceptsfor super

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

于 2012-08-30T13:21:49.737 回答
2

下面的事情让我的脑海中稍微清晰了一些。希望它可以帮助你。

想象一下某个未知类型 X 的元素列表,并且有一些逻辑将列表作为 X 类型的元素显式扫描(在构建列表之后)。让我们将此逻辑称为 Logic1。

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

void scan(List<? extends T>);

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

void add(List<? super T>);

请注意,我的理解是“扫描”和“添加”实际上都可以从列表中删除条目。我发现 PECS 有点令人困惑。“生产者”和“消费者”来自列表的角度。我不喜欢将列表视为可以执行逻辑的活动事物。我喜欢 SEAS(扫描扩展和添加超级)。只是我的2美分。

于 2019-01-01T19:44:43.437 回答