我是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);
...
}
有什么区别?这只是语言限制还是引擎盖下有什么不同?
答案 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进行操作的泛型类型。