【问题标题】:Java Generics new raw type vs generic type [duplicate]Java泛型新的原始类型与泛型类型[重复]
【发布时间】:2018-06-12 05:56:45
【问题描述】:

我看了这么多文章,但我无法理解这两行之间的区别:

ArrayList<String> list = new ArrayList();
ArrayList<String> list = new ArrayList<String>();

我看到的唯一区别是第一行触发了“未经检查的分配”警告。

【问题讨论】:

  • 如果您执行ArrayList&lt;String&gt; list = new ArrayList(Arrays.asList(1,2,3)); - 并且如果您打印list 会发生什么?试试看。
  • 我知道,但是空的构造函数调用呢?
  • 您使用的是原始类型,因此编译器无法检查您的代码是否是类型安全的,因此会发出警告。这里无关紧要,但它仍然是错误的,因为它鼓励草率的编程,使用原始类型(如 Elliott 的示例所示)。它还添加了一个编译警告,您通常应该避免这种情况(至少能够轻松检测到其他严重程度更高的警告)。
  • 这很简单。 new ArrayList() 正在创建一个原始类型数组列表。然后,您将该原始类型分配给具有类型的引用。因此,您进行了不安全/未经检查的分配。
  • 仅供参考,还有第三个选项ArrayList&lt;String&gt; list = new ArrayList&lt;&gt;();,相当于第二个,除了the type is inferred,这意味着你不需要写两次String

标签: java generics


【解决方案1】:

使用未经检查的分配,您可以添加不正确类型的对象。什么会导致 RuntimeException。例如。您可以将整数添加到列表中。对于类型,这是不可能的。

  ArrayList<String> list = new ArrayList(Arrays.asList(1));
        ArrayList<String> list = new ArrayList<String>(Arrays.asList(1));

第一个被接受,第二个出现编译错误。

【讨论】:

  • 很好的例子。简单但清晰。
【解决方案2】:

你可以制作一个原始列表。

List list = new ArrayList();

很好,你现在有一个原始列表,你可以将任何对象放入其中。如果您想将该列表分配给打字版本,您将进行未经检查的分配。

List<String> strings = list;

那是因为,放入列表中的内容从未被检查为字符串。

【讨论】:

  • “没关系”有争议。
  • 对编译器来说很好,但对程序员来说相当麻烦。使用原始类型不会收到警告。
  • "使用原始类型仍然可以接受 java" 仅当您与遗留代码交互时。否则,他们会被强烈劝阻。
  • @AndyTurner 我编辑了它说它没有收到警告,因为如果有人在任何不针对 java 1.4 的项目中使用原始类型,那肯定是“不可接受的。 "
猜你喜欢
  • 1970-01-01
  • 2012-04-03
  • 1970-01-01
  • 1970-01-01
  • 2019-06-04
  • 1970-01-01
  • 2010-11-15
  • 1970-01-01
相关资源
最近更新 更多