java泛型

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


你可以用一个好的助记符来想象returns代表extendsaccepts代表super

因此,Tree读取Tree,这意味着您可以调用Tree中返回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美分。