【问题标题】:Compilation error while running code with RxJava使用 RxJava 运行代码时出现编译错误
【发布时间】: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”

标签: java rx-java rx-java2


【解决方案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 没有报告错误可能是那里的错误。

【讨论】:

  • 是的,这就是问题所在。谢谢你:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-23
  • 2020-12-03
  • 1970-01-01
相关资源
最近更新 更多