Java泛型PECS

时间:2012-08-30 13:13:03

标签: java generics wildcard pecs

我知道PECS是什么意思。

Producer Extends,Consumer Super。

问题是我如何知道它是消费者还是制作人?

此代码也遵循“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;
}

3 个答案:

答案 0 :(得分:3)

您可以使用的一个不错的助记符是为returns设想extends,为accepts设想super

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

答案 1 :(得分:2)

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

答案 2 :(得分:1)

以下内容使我想到了一些事情。希望对您有帮助。

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

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

void scan(List<? extends T>);

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

void add(List<? super T>);

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