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

创建选项的多维通用数组

  •  1
  • Vajk  · 技术社区  · 5 年前

    我想创建一个二维数组(是的,我知道这实际上是一个数组数组)来保存选项。一般的数组创建方法不起作用,尽管它在ClassCastException中失败了。这是我的代码:

    @SuppressWarnings("unchecked")
    Optional<Integer>[][] arr = (Optional<Integer>[][]) new Object[5][5];
    

    有没有一种创建这样一个数组的方法,如果有,该方法是什么?

    3 回复  |  直到 5 年前
        1
  •  1
  •   Stuart Marks    5 年前

    抛开仿制药,你不能 Object[][] 到原始类型 Optional[][] . 你会得到一个 ClassCastException 在运行时。数组必须创建为 可选[ ]] ,而不是 对象[][] . 但仿制药通常是首选的原始类型。

    并不是说你永远不能创建泛型数组。你必须间接地这么做。通常,这样做的方法是创建无边界通配符泛型数组,然后执行未选中的强制转换(如您所做的)到正确的类型:

    @SuppressWarnings("unchecked")
    Optional<Integer>[][] arr = (Optional<Integer>[][]) new Optional<?>[5][5];
    

    以上内容适用于创建特定泛型类型的任何数组。在这种情况下,您可以考虑使用 OptionalInt 而不是 Optional<Integer> . 这就绕过了对泛型数组的任何关注。

    (总的来说,我有点怀疑创建任何风格的选项数组或集合的概念。这看起来很奇怪。通常有更好的选择。但在某些情况下可能是合理的。不管怎样,一组选项是否适合您要解决的任何问题都是一个单独的问题。)

        2
  •  2
  •   Stuart Marks    5 年前

    在Java中 创建泛型类型、参数化类型或类型参数“”的数组是非法的。为什么创建泛型数组是非法的?因为它不是类型安全的。如果是合法的,编译器在其他正确程序中生成的强制转换可能在运行时失败,并带有ClassCastException。这将违反泛型类型系统提供的基本保证。 [ Joshua Bloch -有效爪哇]

    那么,什么解决方案能够创建多维数组呢?

    建议使用容器:

    List<List<Optional<Integer>>> arr = new ArrayList<>();
    for (int i = 0; i < 5; i++) {
        arr.add(new ArrayList<Optional<Integer>>());
    }
    
        3
  •  0
  •   bhusak    5 年前

    由于类型安全,在Java中创建一个泛型数组是非法的。考虑改用列表。 链接到Oracle手册: https://docs.oracle.com/javase/tutorial/java/generics/restrictions.html#createArrays