【问题标题】:Why compiler not give error or give warning for List l = new LinkedList<String>()为什么编译器不对 List l = new LinkedList<String>() 给出错误或警告
【发布时间】:2013-12-10 09:10:58
【问题描述】:

让我解释一下场景。

如果我没记错的话,java 中的Generics 仅用于编译时类型安全。 如果我写

List<String> list = new LinkedList<String>();  // fine
list.add("test");  // fine

这很好。但是 如果我写

List list = new LinkedList<String>();  // fine
list.add(9);  // fine

在这里,我创建了 LinkedList 的 String 和 List 变量指向 LinkedList。 它允许将integer 插入list

现在,Generics 与类型有关。这里TypeList,我还没有为此写generics,即List&lt;String&gt; list 因此,在创建object 的同时在右侧写入generics 而在左侧不写入不会生成List generic。 那么为什么编译器不会在运行/编译时为以下语句发出警告 ar 异常

List list = new LinkedList<String>();

java中使用Generics时写这样的语句是不是没用。

【问题讨论】:

标签: java generics


【解决方案1】:

实际上,如果你写的话,你会得到一个“rawtypes”警告:

List list = new LinkedList<String>();

【讨论】:

  • 哦可能会发出警告。我正在使用 netbeans,但它没有给我该声明的警告
  • @PrashantShilimkar 您需要在编译器设置中启用警告
  • @PrashantShilimkar 哦,对不起,我对netbeans不熟悉,我经常使用eclispe,但我认为它们都调用javac来编译代码。所以他们俩都应该能够显示该消息。也许netbeans中有一些设置来禁止这样的警告:)我认为肖恩是对的。
【解决方案2】:

您不应该使用泛型类型List&lt;T&gt; 来实例化原始类型List。编译器会给你一个警告;但是,这可以通过Type Erasure 来完成。

【讨论】:

    【解决方案3】:

    如果您使用任一选项打开编译器警告,编译器将显示这些警告

    -Xlint:rawtypes,unchecked
    

    -Xlint:all
    

    请参阅javac docsNon-Standard Options 部分

    【讨论】:

      【解决方案4】:

      是的,这将编译原始类型警告,您可以插入任何类型的对象。由于类型擦除,它也可以在运行时工作。

      但这应该避免,因为它没有意义。

      【讨论】:

        【解决方案5】:

        从 JDK 1.5 开始,Java 引入了泛型,用于定义 Collection 内容的类型。 如果你像这样初始化一个 ArrayList..

        List list  = new ArrayList();
        

        那么列表可以包含任何类型的数据,可以是字符串、整数或对象。但是如果你想用特定的数据类型定义你的列表,你可以在尖括号中定义它,像这样..

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

        【讨论】:

          猜你喜欢
          • 2018-05-19
          • 1970-01-01
          • 2014-01-09
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-08-10
          相关资源
          最近更新 更多