我开始学习 Java,我有一个关于泛型的问题。
Collection<E>
在来自接口 的这个方法中:
boolean containsAll( Collection <?> c);
boolean removeAll(Collection<?> c);
boolean retainAll ( Collection <?> c);
为什么是参数 Collection <?> c
而不是Collection <E> c
?
非常感谢
我开始学习 Java,我有一个关于泛型的问题。
Collection<E>
在来自接口 的这个方法中:
boolean containsAll( Collection <?> c);
boolean removeAll(Collection<?> c);
boolean retainAll ( Collection <?> c);
为什么是参数 Collection <?> c
而不是Collection <E> c
?
非常感谢
因为E
需要指定类型参数,而通配符?
适用于每种类型。细微的差别在于
E
指任何指定的类型?
表示任何未知类型由于这些方法应该适用于任何未知类型的集合,因此它们根本不指定类型参数。E
是一个类型变量。?
不是变量,是无法指定的占位符。
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()
任何一对对象并获得有意义的结果,所以您实际上不需要将这些方法限制为特定的项目类型。