【问题标题】:Conversion of arrays with generics使用泛型转换数组
【发布时间】:2013-08-27 13:34:33
【问题描述】:

以下语句有什么区别:

List<E>[] x = (List<E>[]) new List[100];

List<E>[] x = new List[100];

在我的脚本中指出,前者是创建泛型数组的正确方法(尽管它会导致编译器警告)。但我不太清楚(List&lt;E&gt;[]) 语句的用途。 List&lt;E&gt;[] 甚至不是它自己的类型,编译器只会用(List[]) 替换它,所以你会得到

List<E>[] x = (List[]) new List[100];

List[]List[] 的转换,没有用。那么,为什么首先要输入(List&lt;E&gt;[])

【问题讨论】:

  • 注意语言。
  • 抱歉,问题已编辑。不知道接口部分,我只是从脚本中复制出来的,所以我认为它是有效的代码。
  • 对我来说确实没用。它只是将警告从“未经检查的转换”转换为“未经检查的转换”。

标签: java arrays generics


【解决方案1】:

在泛型中,存储在任何集合中的对象类型将在它们添加到集合时进行类型检查。主要通过泛型,不需要了解泛型的人也可以理解代码。因此,通过在编译时插入检查并在运行时擦除可以实现这种行为。

你可以看到:http://docs.oracle.com/javase/tutorial/java/generics/

【讨论】:

    【解决方案2】:

    这个:

    List<E>[] x = new List[100];
    

    说 x 是一个 Array 类型。该数组的元素是可以保存 type E 对象的列表。您正在为其分配一个列表数组,该数组可以容纳任何对象

    下一条语句:

    List<E>[] x = (List<E>[]) new List[100];
    

    也好不到哪里去。铸造不会有帮助。缺陷还是一样。

    归根结底,这一切都是这样做的借口:

    List<E>[] x =  new List<E>[100];
    

    Java 中不允许使用泛型数组。因为数组在运行时保持其元素类型,而泛型构造则不。不能有没有严格定义元素类型的数组。

    问题是由于定义了一个引用类型List&lt;E&gt;[],根据定义,它不允许在 Java 中实例化。因此,请避免使用此类类型。

    您可以使用列表列表作为替代方案。

    【讨论】:

      【解决方案3】:

      泛型通过在编译时检测到更多错误来增加代码的稳定性。

      这是我给出的链接的一部分,认为这很重要,所以我在这里发布

      这是接口定义的一小段摘录列表 和包java.util中的迭代器

      public interface List <E> {
          void add(E x);
          Iterator<E> iterator();
      }
      
      public interface Iterator<E> {
          E next();
          boolean hasNext();
      }
      

      这段代码大家应该都很熟悉了,除了angle里面的东西 括号。这些是接口 List 和 Iterator 的formal type parameters 的声明。

      类型参数可以在整个泛型声明中使用,漂亮 很多地方你会使用普通类型。

      我们知道泛型类型声明List的调用,比如 列表。在调用中(通常称为参数化 type),所有出现的形式类型参数(在本例中为 E) 替换为实际的类型参数(在本例中为 Integer)。

      您可能会认为 List 代表 List 的一个版本 其中 E 已被 Integer 统一替换:

      public interface IntegerList {
              void add(Integer x);
              Iterator<Integer> iterator();
          }
      

      这种直觉可能会有所帮助,但也会误导

      这很有帮助,因为参数化类型 List 确实 确实有看起来像这种扩展的方法。

      这是一种误导,因为泛型的声明永远不会 实际上就是这样展开的。没有多个副本 代码——不在源代码中,不在二进制文件中,不在磁盘上,也不在内存中。

      泛型类型声明是一次性编译的,然后转 放入单个类文件中,就像普通的类或接口一样 声明。

      类型参数类似于中使用的普通参数 方法或构造函数。就像方法具有形式价值一样 描述它所操作的值类型的参数,一个通用的 声明具有正式的类型参数。当一个方法被调用时, 实际参数替换形式参数,并且 方法体被评估。

      当一个泛型声明被调用时, 实际类型参数替换形式类型参数。这就是泛型的>重要性。

      你可以在这里寻找more information about Generics

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-28
      • 1970-01-01
      • 2021-12-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多