【问题标题】:Generics and Collections, don`t understand泛型和集合,不懂
【发布时间】:2017-11-16 16:19:21
【问题描述】:

这3行有什么区别吗?

List list2 = new ArrayList<String>();
List  list2 = new ArrayList<>();
List  list2 = new ArrayList();

据我了解,有关泛型的所有信息都会在运行时删除。因此,只有可验证的类型很重要。所以上面的代码行对我来说意味着同样的事情。如果我错了,任何人都可以给我一些显示差异的例子吗? p.s.对不起我的英语

【问题讨论】:

  • 我不相信你的第二个例子是有效的,因为 &lt;&gt; 运营商不会有任何信息。可能是List&lt;String&gt; list2 = new ArrayList&lt;&gt;();
  • 泛型在运行时被擦除,但它们存在于编译时,让编译器检测到许多潜在的问题。在这种情况下,您使用的是原始类型List list2,它可以接受任何列表,但因此容易出现许多问题。更多信息:What is a raw type and why shouldn't we use it?
  • 对不起,第二行写错了,我的错。但无论如何,我知道原始类型,我对“表达的正确部分”感兴趣。有什么区别: new ArrayList();新的数组列表();我认为两者的意思相同
  • @ViacheslavOn "有什么区别:new ArrayList(); new ArrayList (); " 不 "知道原始类型“否则你不会问这个问题。因为这两者之间的区别在于一个是原始类型,而另一个不是。

标签: java generics collections


【解决方案1】:

虽然通用数据确实在编译时被删除,但这并不意味着它们完全没用。 在您的示例中编译的唯一行是最后一行,但您会收到警告说您正在使用RawTypes。 RawType 是一个没有泛型对象的泛型类。前两行只建了一半。

您几乎使用泛型的原因是列表是类型安全的。如果你使用泛型,你可以使用这样的东西:

List<String> list = new ArrayList<>();
String out = list.get(0);

如果您使用原始类型,则必须这样做:

List list = new ArrayList();
String out = (String) list.get(0);

这看起来不错,但是如果您add 列表中的值不是String 怎么办?程序崩溃。例如:

List unsafe = new ArrayList();
List<String> safe = new ArrayList<>();
unsafe.add("hi");
unsafe.add(new Tree());
safe.add("hi");
safe.add(new Tree());    // This line would throw an exception.
String out = (String) unsafe.get(0);
String out1 = safe.get(0);
String out2 = (String) unsafe.get(1);    // This line would throw an exception.

如果你仍然不太明白为什么要使用泛型类型,那么对于原始类型来说,最后的钉子是这样的:如果我的(String) unsafe.get(1) 在一个单独的类中,在第一百行,我知道 that 行是有问题的行。但是,我不知道非字符串对象被添加到哪里,只知道它被访问到哪里。

如果您使用泛型类型,您可以确切地知道有问题的添加是在哪里进行的,并且可以防止它。

【讨论】:

  • 抱歉,所有行都可以编译,并且没有任何警告。我知道你写的所有东西,但它不是答案。
  • @ViacheslavOn 如果你不认为我写的任何东西都是答案,那么你似乎不了解泛型,这个视频解释得更好:youtube.com/watch?v=1tKmzQh8g5E
  • 抱歉,所有行都可以编译,并且没有任何警告。我知道你写的一切,但这不是答案。 “RawType 是一个没有泛型对象的泛型类。” - 很明显。但是是否原始类仅取决于是否对参考进行了参数化。并且无论对象是否参数化它都没有变化。
  • 观看视频,他提供了比我更连贯和更好解释的例子和理由。即使泛型类型在编译时被删除,它们仍然非常有用。如果没有其他原因,您应该使用它们,因为RawTypes 的存在只是为了向后兼容。
  • 不,我的说法不正确。所有通用列表都可以转换为原始列表。例如,您不能拥有:List&lt;String&gt; list = new ArrayList();,而您可以拥有:List list = new ArrayList&lt;String&gt;();
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-12-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多