【发布时间】:2017-12-11 22:27:09
【问题描述】:
我是 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 是将数据写入someWeirdMapWithObject 的 Observable 列表。顾名思义,someWeirdMapWithObject 具有 Object 作为值。
奇怪的是,在 Intellij IDEA 中这个 sn-p 会很好,没有错误,没有警告(除了一个 - 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 测试,我注意到当我制作相同类型的可观察对象时,此代码将编译,否则不会编译):
@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;
}
}
【问题讨论】:
-
这可能是您的 Javac 版本或 IntelliJ 版本错误的类型推断异常。你用的是什么版本?
-
我在 Ubuntu 16.04 LTS 上使用 Intellij IDEA Ultimate 2017.1.3
-
你的java版本是多少?另外请提供一个包含所有对象和类型定义的独立示例。
-
你能展示你的brandBuilder.build()实现吗??
-
@akarnokd 实现添加,openjdk 版本“1.8.0_151”