如何将 toArray 结果转换为 CompletableFuture<Texture>[] 类型?

How to convert toArray result to a CompletableFuture<Texture>[] type?

我浏览了几十个答案,但他们所做的大部分是建议 string::new 或类似的技巧。在我的例子中,我想要转换的类型是 CompletableFuture<Texture>。这是这个 POJO:

class ARObject {
  CompletableFuture<Texture> texture;

  void setTexture(CompletableFuture<Texture> texture) {
    Log.d(TAG, String.format("Texture set for %d", resourceId));
    this.texture = texture;
  }

  CompletableFuture<Texture> getTexture() {
    return texture;
  }
}

由于重构 arObjectList 现在是一个数组。

private ARObject[] arObjectList = {
    ...
};

(显然这是一个简化,对象有更多的字段)。我想要的只是获得一个 CompletableFuture<Texture> 的数组,这样我就可以将它传递给 CompletableFuture.allOf(...)。这是我想要的:

CompletableFuture<Texture>[] texturePromises = Stream.of(arObjectList).map(ARObject::getTexture).toArray();
CompletableFuture.allOf(texturePromises)

但是 toArray return 是 Object[] 根据 IDE。 CompletableFuture<Texture>::new 生成器没有工作,但无论如何这都不是一个好主意,我们不想重新分配或弄乱这些未来。只是 return 它们的数组。传递 new CompletableFuture<Texture>[arObjectList.length] 不编译。

请勿将此问题标记为重复,除非您完全确定并且可以指出解决方案。我通读了十几个条目。

arObjectList是列表吗?那么明明就是arObjectList.size();不是 arObjectlist.length.

一般来说,混合泛型和数组是行不通的。考虑过时的数组,尤其是非原始数组。 'Pain'(从某种意义上说,你必须跳过障碍,可能会陷入 'raw types',这会导致警告)如果你试图将两者混合,就会随之而来。

一般来说,你不能创建其中包含泛型的数组;这是一个限制。您可以做的是制作一个原始类型的数组并进行转换。

Object o = new List<String>[10]; // illegal
List<String>[] o = (List<String>[]) new List[10]; // legal, but warnings

因此,类似于:

CompletableFuture<Texture>[] texturePromises = (CompletableFuture<Texture>[]) Stream.of(arObjectList).map(ARObject::getTexture).toArray(CompletableFuture[]::new);

会完成这项工作。带有警告。警告是不可避免的;真正的解决方案是停止对几乎所有内容使用数组;当然不要在这里使用它们。