Java Collection方法

时间:2013-02-11 00:01:07

标签: java

我开始学习Java,我对泛型有疑问。

来自Collection<E> interface:

的此方法

boolean containsAll( Collection <?> c);
boolean removeAll(Collection<?> c);
boolean retainAll ( Collection <?> c);

为什么参数Collection <?> c代替Collection <E> c

非常感谢

2 个答案:

答案 0 :(得分:2)

因为需要指定E类型参数,而通配符?适用于每种类型。微妙的区别在于

  • E表示任何指定的类型
  • ?表示任何未知类型

由于方法应该适用于任何未知类型的集合,因此它们根本不指定类型参数。 E是一个类型变量。 ?不是变量,是一个无法指定的占位符。

答案 1 :(得分:2)

JDK设计人员希望能够实现以下代码:

Collection<String> strings = Arrays.asList("foo", "bar", "baz");
Collection<Object> objects = Arrays.asList("foo", 123);
strings.removeAll(objects);
// strigns now contains only "bar" and "baz"

(上面的代码可能没有完全编译,因为我不记得Arrays.asList()如何捕获类型参数,但它应该得到重点。)

也就是说,因为您可以在任何一对对象上调用.equals()并获得有意义的结果,所以您实际上不需要将这些方法限制为特定的项类型。