3

我开始学习 Java,我有一个关于泛型的问题。

Collection<E>在来自接口 的这个方法中:

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

为什么是参数 Collection <?> c而不是Collection <E> c

非常感谢

4

2 回答 2

2

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

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

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

于 2013-02-11T00:03:59.673 回答
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()任何一对对象并获得有意义的结果,所以您实际上不需要将这些方法限制为特定的项目类型。

于 2013-02-11T00:24:21.373 回答