代码之家  ›  专栏  ›  技术社区  ›  brasskazoo

将泛型列表强制转换为非泛型列表的含义是什么?

  •  1
  • brasskazoo  · 技术社区  · 16 年前

    我正在重新调整一个国产的刀容器,希望使类通用。它内部使用 ArrayList 存储检索到的对象。

    此类的一个用法将容器的列表放入请求范围,由于WebSphere的限制,我无法传递泛型 List<Foo> 到请求范围(WebSphere不直接处理泛型)

    如果我继续重构,我将需要转换/转换 列表<foo> 变为非泛型 List 对象..

    // Boils down to this...
    List<Foo> listFoo = new FooListing().findAllFoo();
    List listThings = listFoo;
    request.setAttribute("listThings", listThings);
    

    像这样逆转一个基因化的含义是什么?我应该避免做这种操纵吗?

    编辑: 代码段很冗长,可以显式地演示我描述的内容。

    5 回复  |  直到 16 年前
        1
  •  3
  •   Thilo    16 年前

    如果列表的组件类型与预期类型匹配,则没有问题。

    Java中的泛型仅用于编译器的类型检查,它们在运行时不起作用。如果您使用的是不支持泛型的旧库,那么除了忽略泛型类型之外,您别无选择。 事情应该继续进行,因为这个系统的设计考虑到了向后兼容性。

    所以你丢失的是编译时类型检查(它使你回到Java在1.4处的位置,这意味着,如果类型匹配,所有的东西都会工作,如果不是,你将在运行时得到CLSASSCAST异常或其他不想要的行为)。

    不过,我想你可以只写

    request.setAttribute("listThings", listFoo);
    

    此方法接受任何类型的对象。即使它想要一个列表,你仍然可以通过 List<Foo> (这仍然是一个列表)。

        2
  •  2
  •   William Billingsley    16 年前

    Java使用泛型类型的“类型擦除”——本质上这意味着编译器检查泛型,但是运行时忘记了它的全部内容,只是把它当作一个对象列表。

    每当你治疗 List<Foo> 作为一个列表,您不会得到编译器检查以确保您不会将BLA放入您的列表中。所以如果你打电话给 List<Foo>.get() 结果这是一个隐藏在列表中的bla。但只有当一些代码将BLA放在列表中时,这种情况才会发生。

    如果你不小心,那么如果你通过 列表<foo> 作为可能向列表中添加非foo的任何内容的列表,不要将其视为 列表<foo> 当你访问它时,把它当作 Objects 并添加检查实例。

    *有些信息在运行时是可以访问的,但不要让事情复杂化。

        3
  •  1
  •   Laurence Gonsalves    16 年前

    泛型类型的“非泛型”版本称为“原始类型”。

    传递请求原始等价物的泛型类型通常是可以的。这实际上是Java中泛型工作的主要原因(用擦除):启用“泛化”代码和前泛型代码之间的互操作性。

    最重要的是,如果你通过了 List<Foo> 为了某件事 List ,他们可能会将- Foo 对象到 表 . 在这里您不会得到任何编译时检查来帮助您。你 做 获取一些运行时检查:a ClassCastException 当使用返回 福 在您的 列表<foo> 它必须返回一个非- 福 .

    如果你想要更多的快速失败行为,你可以 列表<foo> 具有 Collections.checkedList() 获取一个在插入时检查元素类型的列表。

    如果 福 它本身是一个泛型类型。运行时检查只对已具体化的类型(即删除了泛型类型参数的类型)执行,因此如果您为它们提供 List<Set<Bar>> 它们插入一个 Set<Baz> 或者只是一个 Set ,因为元素的运行时/具体化类型是 集合 不管怎样。

        4
  •  0
  •   Spencer Ruport    16 年前

    首先,不能将泛型强制转换为非泛型列表,因此必须转换它。

    第二,泛型列表的两个主要优点是:1)它确保所有对象都是指定的类型;2)它允许您直接访问对象集合的方法,而无需重新对它们进行编码。这允许您编写更干净的代码,并节省一些处理周期(从不得不回滚到第四个)。

    然而,这些优势中没有一个是迫切需要的。如果你不能使用它们,你就不会注意到性能上的差异。不过,您的代码可能看起来有点乱。

        5
  •  0
  •   Artsiom Anisimau    16 年前

    我在WebLogic门户上也有类似的问题。只需在本例中使用none泛型类型。