我对Reactive编程很新,并且这个方法不能编译,我无法正确编程,
public Observable<Data> findData(long templateId) {
..
..
return Observable.zip(templateObs, dataObs, (templateObj, dataObj) -> {
try {
switch(model) {
case SINGLE: {
..
..
return new Data();
}
case TOURNAMENT: {
// compilation error on the entire .zip block :
// Type mismatch: cannot convert from Observable<Object> to Observable<Data>
return Observable.zip(obs1, obs2, obs3, obs4, (data, data2, data3, data4) -> {
..
..
return new Data(data1,data2,data3,data4);
}).flatMap(results -> results);
}
}
}catch(DataException e) {
log.error(e);
}
return null;
});
}
由于某种原因,内部返回.zip返回Observable而不是Observable - 这会导致编译错误......
如果我从内部.zip中删除'return',那么它就会编译。
答案 0 :(得分:1)
zip
需要一个返回Object
的lambda,在您的情况下为Data
,这是您在SINGLE
案例中所做的。
在TOURNAMENT
中,您返回的是一个不是Data
对象的Observable。
根据您的情况,如果您想要返回Data
,那么您必须使用zip
方法阻止嵌套的toBlocking
运算符。
case TOURNAMENT:
return Observable.zip(obs1, obs2, obs3, obs4,
(data, data2, data3, data4) ->
{ return new Data(data1,data2,data3,data4); }
).toBlocking().single();
否则,您可以返回Data
对象而不是Observable<Data>
对象。在这种情况下,只需更改SINGLE
案例即可返回仅Observable
对象的Data
。
case SINGLE: return Observable.just(new Data());