Java generics PECS
我知道pecs的意思。
生产者延伸,消费者至上。
问题是我怎么知道它是消费者还是生产者?
这个代码也遵循"PECS"吗?
1 2 3 4 5 6 7 8 9 10 11 | 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; } |
你可以用一个好的助记符来想象
因此,
- Producer引用方法的返回类型。
- 使用者是指方法的参数类型。
以下几点在我的头脑中澄清了一些事情。希望对你有帮助。
想象一个未知类型x的元素列表,这里有一些逻辑,其中一些逻辑将列表显式地扫描为类型x的元素(在构建列表之后)。我们称之为逻辑逻辑1。
如果要将该列表扫描为t类型的对象,则需要以某种形式从t派生x。否则,您将遇到问题。因此,您的签名应为:
1 | void scan(List<? extends T>); |
如果要将t类型的对象添加到列表中,则需要从x派生t。否则,上面提到的logic1将有问题。因此,您的签名应为:
1 | void add(List<? super T>); |
请注意,我理解"扫描"和"添加"实际上都可以从列表中删除条目。我觉得胸肌有点混乱。"生产者"和"消费者"都是从列表的角度出发的。我不喜欢把列表看作可以执行逻辑的活动对象。我喜欢海洋(扫描扩展和添加超级)。只有我的2美分。