我开始学习Java,我对泛型有疑问。
来自Collection<E>
interface:
boolean containsAll( Collection <?> c);
boolean removeAll(Collection<?> c);
boolean retainAll ( Collection <?> c);
为什么参数Collection <?> c
代替Collection <E> c
?
非常感谢
答案 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()
并获得有意义的结果,所以您实际上不需要将这些方法限制为特定的项类型。