2013-02-18 97 views
2

我是新来的Java,并试图从Java泛型和集合书中了解下面的好奇语法..(我广泛使用C++模板,因此可以声称了解泛型编程的基础知识和可能的陷阱):“?extends E”和“T extends E”之间有什么区别?

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

为什么不能在上面写为:

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

的区别是什么?这仅仅是语言限制还是在引擎盖下有什么区别?

回答

6

它可以写成

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

但就没有任何意义。没有必要命名该参数。

+2

你的意思是'公众布尔addAll(收集 C);' – 2013-02-18 18:44:46

+1

我低估了这个把你的注意力引向我以前的评论。 – 2013-02-18 18:50:23

+0

现在已经修复。 – 2013-02-18 18:57:03

3

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

假设中的addAll需要一个过滤器:

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

现在你知道谓词已经可以在类集c操作泛型类型。

相关问题