【发布时间】:2010-11-06 14:36:30
【问题描述】:
代码Collection<E>上的<E>是什么意思?
【问题讨论】:
-
我需要你的帮助来更好地学习这些收藏。
标签: java generics collections
代码Collection<E>上的<E>是什么意思?
【问题讨论】:
标签: java generics collections
这是泛型的使用。检查此intro。然后不要忘记阅读此tutorial。
摘录如下(比较使用强制转换与使用泛型):
当你看到代码
时,阅读它 作为“类型”;上面的声明 读作“字符串 c 的集合”。这 使用泛型的代码更清晰 更安全。我们已经消除了一个不安全的 演员表和一些额外的 括号。更重要的是,我们有 移动了规范的一部分 从评论到它的方法 签名,因此编译器可以验证 在编译时该类型 运行时不违反约束 时间。因为程序编译 没有警告,我们可以用 确定它不会抛出 运行时的 ClassCastException。这 使用泛型的净效应, 尤其是在大型程序中,是 提高了可读性和稳健性。
比如一个List的接口是
public interface List<E> {
void add(E x);
Iterator<E> iterator();
}
这意味着您可以构建一个列表,其内容都是相同的显式类型(不仅是 Object 类型),即使您自己定义了类型。因此,如果您创建一个 Name 类,您可以编写
List<Name> nameList = new ArrayList<>();
然后用 Name 实例填充它并直接从中检索 Name 实例,而无需强制转换或以其他方式担心它,因为您总是会得到 Name 实例或 null 返回,而不是不同类型的实例。
更重要的是,您不能在这样的 List 中插入与 Name 实例不同的任何内容,因为它会在编译时失败。
nameList.add(false); //Fails!
nameList.add(new Name("John","Smith")); //Succeeds supposing Name has a
//firstName, lastName constructor
【讨论】:
List<T> 读作“类型列表”,好像 T 是 Type 的缩写。我在很多代码中注意到<E>。它是什么东西的缩写吗?或者我应该把它读作“Es 的集合”
这意味着您正在处理类型为E 的项目集合。想象一下,你有一杯茶。除了茶,它还可以装咖啡,因此将杯子描述为通用实体是有意义的:
class Cup<T> { … }
现在你可以用咖啡或茶(或其他东西)来填充它:
Cup<Tea> cuppa = new Cup<Tea>();
Cup<Coffee> foamee = new Cup<Coffee>();
为了使其工作,Tea 和 Coffee 都需要在您的程序中定义类型。
这是您代码的编译时约束。回到(相当无用的)杯子示例,集合(数组,列表......)通常包含 one 类型的项目,例如整数或字符串。泛型可帮助您在 Java 中表达这一点:
Collection<String> strList = new ArrayList<String>();
strList.add("Foobar"); // Works.
strList.add(42); // Compile error!
注意到上面的编译错误了吗?你只有在使用泛型时才会得到这个。以下代码也有效,但不会给出很好的错误消息:
Collection strList = new ArrayList();
strList.add("Foobar"); // Works.
strList.add(42); // Works now. Do we really want this?!
【讨论】: