“?extends E”和“T extends E”有什么区别?

时间:2013-02-18 18:41:53

标签: java generics collections subtyping

我是java新手,我正在尝试从Java Generics和Collections书中理解下面的奇怪语法。(我​​广泛使用C ++模板,因此可以声称理解泛型编程的基础知识和可能的陷阱): / p>

interface Collection <E> {
  ...
  public boolean addAll(Collection<? extends E> c);
  ...
}

为什么不能将上述内容写成:

interface Collection <E> {
  ...
  public boolean addAll(Collection<T extends E> c);
  ...
}

有什么区别?这只是语言限制还是引擎盖下有什么不同?

2 个答案:

答案 0 :(得分:7)

可以写成

 public <T extends E> boolean addAll(Collection<T> c)

但没有意义。无需为该参数命名。

答案 1 :(得分:3)

如果方法返回类型为T的东西,那将是有意义的。然后你可以匹配这两种类型。但是因为它只返回一个布尔值,所以你不需要这样做。然后就不需要设置名称T,它仍然只是一个问号。

假设addAll采用过滤器:

public <T extends E> boolean addAll(Collection<T> c, Predicate<T> aFilter);

现在您知道Predicate有一个可以对集合c进行操作的泛型类型。