我是RxJava的新手,请原谅我所有新手的错误;)
我有以下代码:
Observable
.fromIterable( observables )
.flatMap(task -> task.observeOn(Schedulers.computation()))
// wait for all tasks to finish
.lastOrError()
.flattenAsObservable( x -> someWeirdMapWithObject.values())
.cast(BrandBuilder.class)
.map( brandBuilder -> brandBuilder.build() )
observables
是一个Observable列表,它将数据写入someWeirdMapWithObject
。顾名思义,someWeirdMapWithObject的值为Object
。
奇怪的是,在Intellij IDEA中,这个代码片段会很好,没有错误,没有警告(除了一个 - brandBuilder.build()可以内联)。 但是当我尝试编译这段代码时,会出现编译错误:
error: cannot find symbol
.map( brandBuilder -> brandBuilder.build() )
^
symbol: method build()
location: variable brandBuilder of type Object
当我将最后一行更改为:
.map( brandBuilder -> ((BrandBuilder) brandBuilder).build() )
一切都很好。
我的问题是:
为什么演员不会工作?
我的代码是否合适?有没有办法更好地执行它?
以及为什么(引用Tommy Wiseau:'为什么,Java为什么?')此代码无法编译?
提前感谢您的回复;)
修改
下面更好的例子(作为Junit测试,我注意到当我创建相同类型的可观察对象时,这个代码将编译,否则它会赢得&#t;)
@Test
public void test() throws Exception {
Observable<String> first = Observable.fromCallable(() -> "HEY").delay(250, TimeUnit.MILLISECONDS);
Observable<Integer> second = Observable.fromCallable(() -> 1).delay(350, TimeUnit.MILLISECONDS);
List<Observable> observables = com.google.common.collect.Lists.newArrayList(first, second);
Map<Long, Object> someWeirdMapWithObject = com.google.common.collect.ImmutableMap.of(
1L, new BrandBuilder(1),
2L, new BrandBuilder(2)
);
Observable
.fromIterable(observables)
.flatMap(task -> task.observeOn(Schedulers.computation()))
// wait for all tasks to finish
.lastOrError()
.flattenAsObservable(x -> someWeirdMapWithObject.values())
.cast(BrandBuilder.class)
.map(BrandBuilder::build)
.toList().blockingGet();
}
class BrandBuilder{
private int bar;
BrandBuilder(int bar) {
this.bar = bar;
}
public Brand build(){
return new Brand(this.bar);
}
}
class Brand{
private int bar;
Brand(int bar) {
this.bar = bar;
}
}
答案 0 :(得分:1)
问题似乎来自此声明中的原始类型:
List<Observable> observables =
com.google.common.collect.Lists.newArrayList(first, second);
这似乎在下面的流程中抛弃了javac并阻止了泛型/推理正常工作。使用
List<Observable<?>> observables =
com.google.common.collect.Lists.newArrayList(first, second);
相反,以下所有内容都应该编译。
对我来说,Eclipse最新确实在编辑器中指出了问题,突出显示::build
部分,所以我猜IntelliJ没有报告错误可能是那里的错误。