【问题标题】:What does <E> mean in Collection<E>?Collection<E> 中的<E> 是什么意思?
【发布时间】:2010-11-06 14:36:30
【问题描述】:

代码Collection&lt;E&gt;上的&lt;E&gt;是什么意思?

【问题讨论】:

  • 我需要你的帮助来更好地学习这些收藏。

标签: java generics collections


【解决方案1】:

这是泛型的使用。检查此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&lt;T&gt; 读作“类型列表”,好像 T 是 Type 的缩写。我在很多代码中注意到&lt;E&gt;。它是什么东西的缩写吗?或者我应该把它读作“Es 的集合”
【解决方案2】:

这意味着您正在处理类型为E 的项目集合。想象一下,你有一杯茶。除了茶,它还可以装咖啡,因此将杯子描述为通用实体是有意义的:

class Cup<T> { … }

现在你可以用咖啡或茶(或其他东西)来填充它:

Cup<Tea> cuppa = new Cup<Tea>();
Cup<Coffee> foamee = new Cup<Coffee>();

为了使其工作,TeaCoffee 都需要在您的程序中定义类型。

这是您代码的编译时约束。回到(相当无用的)杯子示例,集合(数组,列表......)通常包含 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?!

【讨论】:

  • 有点令人困惑,因为类 Cup 实际上会发音为 Cup Of T :)
  • @lagerdalek:这完全没有引起我的注意。 ;-) 其实这个解释是受这个启发的:zazzle.com/c_cup_of_t_mug-168503670567870702
  • 在我看到 Joel Pobar 在 Tech-Ed 进行 F# 演讲后,我从 zazzle 得到了我自己的 Cup 杯子,开场幻灯片展示了一个 Cup 杯子 :)
猜你喜欢
  • 2016-02-06
  • 2020-03-03
  • 2015-09-21
  • 2019-05-07
  • 1970-01-01
  • 2015-08-04
  • 2012-05-30
  • 2021-02-16
相关资源
最近更新 更多