【问题标题】:Effective Java: What is exactly generics array creation warning有效的 Java:什么是泛型数组创建警告
【发布时间】:2015-05-13 11:41:31
【问题描述】:

Java 中不允许创建泛型类型对象数组。数组没有足够的类型信息来根据运行时的类型检查 ArrayStoreException 和 ClassCastException。这就是原因。但是,Effective java 中第 24 条的第一段说,

当你使用泛型编程时,你会看到很多编译器警告: 未经检查的强制转换警告,未经检查的方法调用警告, 未经检查的通用数组创建警告和未经检查的转换 警告。你获得的仿制药经验越多,越少 您会收到警告,但不要期望新编写的代码使用 可以干净编译的泛型。

什么是泛型数组创建警告?如果我们要创建一个泛型类型对象的数组,我们必须得到一个编译错误。为什么要警告?应该是错误。

提前谢谢你。

【问题讨论】:

  • 应该什么错误? ;)
  • 也许this 会回答你的问题。
  • 例如 List strings = new ArrayList[10];给我们一个编译错误。但作者解释说创建通用数组是一个警告。为什么?
  • 抱歉勘误。不是运行时异常。这是一个编译错误。
  • @inherithandle 上面的语句给你一个编译错误,因为你混淆了对象创建和数组创建语法。

标签: java arrays generics


【解决方案1】:

您所指的警告是由于 varargs 方法中发生的自动数组创建,如下所示:

public void method(List<String>... listArgs) { ... }

如果你打电话:

method(new ArrayList<String>(), new ArrayList<String>());

你会看到警告(我认为实际警告文本会根据 Java 版本而有所不同):

[unchecked] unchecked generic array creation for varargs parameter of type List<String>[]

Java 对 varargs 方法所做的是创建一个可变参数参数的数组,所以在这种情况下,它会尝试创建一个 List&lt;String&gt;[],这是一个泛型数组,因此会发出警告消息(因为它将被解密到List&lt;?&gt;[])。

【讨论】:

    【解决方案2】:
        //create collection and add some elements
        List<LinkedList<Integer>> myList = new LinkedList<LinkedList<Integer>>();
        myList.add(new LinkedList<Integer>());
        myList.add(new LinkedList<Integer>());
    
        //now if you want to convert it to array, you have to choose the first option 
        //from below (and get a warning), because the second option is unsupported
    
        //1. warning
        List[] listArray = myList.toArray(new List[myList.size()]); 
    
        //2. error
        List<Integer>[] listArray = myList.toArray(new List<Integer>[myList.size()]);
    

    因此,如果您将其设为唯一可行的方式(第一种方式),那么您必须转换回最初的类型,并且您会收到另一个未经检查的转换的警告。

    【讨论】:

      【解决方案3】:

      作者说“未选中通用数组创建警告”。这样的事情会引发警告,而不是错误:

      Stack<Integer>[] stacks = (Stack<Integer>[]) new Object[10]; // warning: unchecked cast
      Stack<Integer>[] stacks2 = new Stack[10]; // warning: unchecked assignment
      

      当你说它应该是一个错误时,你是在考虑:

      Stack<Integer>[] stacks = new Stack<Integer>[10]; // error: generic array creation
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-06-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-03-08
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多