【发布时间】:2017-12-10 19:50:29
【问题描述】:
谁能给我解释一下下面几行代码:
import org.apache.beam.sdk.Pipeline;
[..]
Pipeline p = Pipeline.create(options);
p.apply(TextIO.read().from("gs://apache-beam-samples/shakespeare/*"))
.apply("ExtractWords", ParDo.of(new DoFn<String, String>() {/* etc */}
我不明白为什么会这样编译。 Pipeline 中的 Apply 方法返回一个 T extends POutput。 接口 POutput 没有任何 apply 方法。
在这种情况下,TextIO.read().from(...) 恰好返回一个 PCollection 作为 POutput,并且 THAT 有一个 apply 方法。
但就 Pipeline 合约而言,我们知道只会返回一个 POutput。 那么编译器如何检查传递给第一个 apply 的参数类型呢?根据我在编写 Java 时的记忆,这只能在运行时看到。
【问题讨论】:
-
类型 T 在编译时是已知的。
-
这与我认为我所知道的相矛盾 - 在编译时 T 被替换为它的有界类型 - 在我们的例子中是 POutput
标签: java apache-beam