gpt4 book ai didi

android - 列出将 >10 个改造调用与 rxjava2 结合在一起的子类型转换

转载 作者:搜寻专家 更新时间:2023-11-01 09:24:58 24 4
gpt4 key购买 nike

我想从我的移动 Android 应用调用我的 API 端点。

我通常使用 zip 运算符等待最后一个操作完成,但我有超过 10 个改造调用要处理,我发现 zip 运算符输入的最大函数是 Function9。

我尝试传递一个可迭代对象,但我对发射器内部的类型有疑问:

@GET("/endpoint/A")
Single<List<A>> getA();

@GET("/endpoint/B")
Single<List<B>> getB();

@GET("/endpoint/C")
Single<List<C>> getC();

....

每个数据类型 A、B、C... 都实现了一个接口(interface) Sample,这样我就可以将一个 List 传递给 zip 运算符:

List<Single<List<Sample>>> callsList = new ArrayList<>();
callsList.add(apiService.getA()); // error, expected Single<List<Sample>

我试过强制类型转换但也没用

我的目标是使用 iterable 来实现这样的目标:

Single.zip(callsList, new Function<Object[], BundledData>() {
@Override
public BundledData apply(Object[] objects) throws Exception {
return new BundledData(...);
}
})

所以我请求你的帮助:

  • 解决类型不兼容问题
  • 将正确的数据格式传递给应用函数

谢谢

最佳答案

你不能这样施法。因为Single<List<A>>不是 Single<List<Sample>> 的子类型.这里ASample 的子类型但单例> is not subtype of单>`.

让我举个简单的例子:

    List<Number> listA = new ArrayList<>();
List<Integer> listB = new ArrayList<>();

listA = listB; // this line is not valid.

但这是有效的:

    Number number = 10;
Integer integer = 20;

number = integer;

因为 IntegerNumber 的子类型.和 listA = listB;无效,因为 listB不是 listA 的子类型.

但是你仍然可以转换它,你必须使用 Wildcard .

使用通配符就像:

    List<? extends Number> listA = new ArrayList<>();
List<? extends Integer> listB = new ArrayList<>();

listA = listB;

现在List<? extends Integer>List<? extends Number> 的子类型

为了使转换成为可能,我们需要一个共同的 parent List<Number>List<Integer>List<?>是共同的 parent 。

这在 official doc 中有很好的解释

enter image description here

Although Integer is a subtype of Number, List<Integer> is not a subtype of List<Number> and, in fact, these two types are not related. The common parent of List<Number> and List<Integer> is List<?>.

In order to create a relationship between these classes so that the code can access Number's methods through List's elements, use an upper bounded wildcard:

你的情况是一样的。您需要使用上限通配符。

List< Single< ? extends List< ? extends Sample> > > callsList = new ArrayList<>();

希望对您有所帮助。

关于android - 列出将 >10 个改造调用与 rxjava2 结合在一起的子类型转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51376198/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com