3

我是 java 新手,我试图从 Java 泛型和集合一书中理解下面奇怪的语法。(我​​广泛使用 C++ 模板,因此可以声称了解泛型编程的基础知识和可能的陷阱):

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

为什么上面不能写成:

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

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

4

2 回答 2

8

它可以写成

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

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

于 2013-02-18T18:43:30.293 回答
3

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

假设 addAll 需要一个过滤器:

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

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

于 2013-02-18T18:44:58.870 回答