Java generics PECS



我知道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;
}

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

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

  • Producer指的是方法的返回类型
  • 使用者是指方法的参数类型

下面的内容稍微澄清了我的想法。希望它能帮助你。

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

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

void scan(List<? extends T>);

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

void add(List<? super T>);

请注意,据我所知,"扫描"one_answers"添加"实际上都可以从列表中删除条目。我觉得PECS有点令人困惑。"生产者"one_answers"消费者"来自列表的角度。我不喜欢把列表看作是可以执行逻辑的活跃事物。我喜欢SEAS(扫描扩展和添加超级)。只有我的2美分。

最新更新