繁体   English   中英

创建 Optionals 的多维通用数组

[英]Create a multidimensional generic array of Optionals

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

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

有没有办法创建这样的数组,如果是,那将是什么方法?

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

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

推荐的是使用容器:

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

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

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

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

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

(总的来说,我有点怀疑创建阵列或任何风格的Optionals集合的概念。这似乎是一件奇怪的事情。通常有更好的选择。但在某些情况下它可能是合理的。无论如何,无论是Optionals数组适用于您尝试解决的任何问题,这是一个单独的问题。)

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM