Может ли кто-нибудь объяснить мне следующие строки кода:
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 */}
Я не понимаю, почему это компилируется. Метод Apply в конвейере возвращает T extends POutput. Интерфейс POutput не имеет метода применения.
В этом случае так получилось, что TextIO.read (). From (...) возвращает PCollection как POutput, а THAT имеет метод apply.
Но что касается контракта на трубопровод, мы знаем, что будет возвращен только POutput. Итак, как компилятор может проверить тип аргумента, переданного первому приложению? Из того, что я помню, когда я кодировал Java, это можно было увидеть только во время выполнения.