我是java新手,正在尝试从Java泛型和集合一书中理解下面的奇怪语法。(我广泛地使用过C++模板,因此可以声称理解泛型编程的基础知识和可能的陷阱):
interface Collection <E> {
...
public boolean addAll(Collection<? extends E> c);
...
}
为什么上面的内容不能写成:
interface Collection <E> {
...
public boolean addAll(Collection<T extends E> c);
...
}
有什么关系?这仅仅是语言的限制,还是在幕后有什么不同?
发布于 2013-02-19 02:43:30
它可以写成
public <T extends E> boolean addAll(Collection<T> c)
但这是没有意义的。不需要为该参数命名。
发布于 2013-02-19 02:44:59
如果该方法返回T类型的内容,那么这将是有意义的。然后,您可以匹配两种类型。但是,因为它只返回一个布尔值,所以您不需要这样做。这样就不需要设置名称T了,它仍然是一个问号。
假设addAll使用一个过滤器:
public <T extends E> boolean addAll(Collection<T> c, Predicate<T> aFilter);
现在您知道了谓词有一个可以在集合c上操作的泛型类型。
https://stackoverflow.com/questions/14943181
复制相似问题