我想创建一个包含Optionals的二维数组(是的,我知道这实际上是数组的数组)。通用数组创建的常规方法无法正常运行,因为它会因ClassCastException而失败。这是我的代码:
@SuppressWarnings("unchecked")
Optional<Integer>[][] arr = (Optional<Integer>[][]) new Object[5][5];
有没有一种创建这种数组的方法,如果可以的话,那是什么方法?
答案 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