创建可选的多维通用数组

时间:2019-01-11 19:04:44

标签: java generics multidimensional-array optional

我想创建一个包含Optionals的二维数组(是的,我知道这实际上是数组的数组)。通用数组创建的常规方法无法正常运行,因为它会因ClassCastException而失败。这是我的代码:

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

有没有一种创建这种数组的方法,如果可以的话,那是什么方法?

3 个答案:

答案 0 :(得分:2)

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

那么什么方法可以创建多维数组呢?

推荐的一种方法是使用容器:

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

答案 1 :(得分:1)

除了泛型外,您不能将Object[][]强制转换为原始类型的Optional[][]。您将在运行时获得ClassCastException。必须将数组创建为Optional[][],而不是Object[][]。但是泛型通常是首选的原始类型。

这并不是说您永远无法创建泛型数组。您必须间接这样做。通常,执行此操作的方法是创建无界通配符泛型数组,然后对类型进行无限制的强制转换(如您所做的那样):

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

以上内容适用于创建某些特定通用类型的任何数组。在这种情况下,您可以考虑使用OptionalInt而不是Optional<Integer>。这避免了对泛型数组的任何担忧。

(总的来说,我有点怀疑创建任何口味的Optionals的数组或集合的想法。这似乎很奇怪。通常有更好的选择。但是在某些情况下它可能是有道理的。无论如何,则可选的数组是否适合您要解决的任何问题都是一个单独的问题。)

答案 2 :(得分:0)

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