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

3

我是Java的新手,正在尝试理解下面这个来自《Java Generics and Collections》书中的奇怪语法。(我曾经广泛地使用C++模板,因此可以声称理解通用编程的基础知识和可能出现的问题):

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

为什么上述内容不能写成以下形式:
interface Collection <E> {
  ...
  public boolean addAll(Collection<T extends E> c);
  ...
}

有什么区别吗?仅仅是语言限制还是底层有任何差异?

2个回答

8
这段内容可以翻译为:它可以写成。
 public <T extends E> boolean addAll(Collection<T> c)

但这没有意义。不需要给该参数命名。


2
你的意思是 public <T extends E> boolean addAll(Collection<T> c); - Rohit Jain
1
我给这个点了踩是为了引起你对我的先前评论的关注。 - Rohit Jain

3

如果该方法返回T类型的某物,则这样做是有意义的。那么您可以匹配两种类型。但由于它只返回一个布尔值,所以您不需要这样做。然后就没有必要设置一个名称T,它仍然只是一个问号。

假设addAll采用了过滤器:

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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接