我知道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;
}
答案 0 :(得分:3)
您可以使用的一个不错的助记符是为returns
设想extends
,为accepts
设想super
。
所以Tree<? extends T>
读取Tree<? returns T>
,这意味着您可以调用返回Tree
的{{1}}中的方法,但不能调用接受T
的方法作为参数类型。
答案 1 :(得分:2)
答案 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美分。