署名である:
public <OutputT extends POutput> OutputT apply(
String name, PTransform<? super PBegin, OutputT> root) {
...
}
これはPOutput
を拡張するすべての可能なタイプOutputT
ため、この方法は(String, PTransform<? super PBegin, OutputT>)
戻るOutputT
に適用可能であることを意味します。
TextIO.read()
は、TextIO.Read
を返します。PTransform<PBegin, PCollection<String>>
を返します。それはPTransform<? super PBegin, OutputT>
一致します
は
- タイプ
PBegin
は自明PBegin
- タイプ
PCollection<String>
のスーパータイプですのでPOutput
拡張し、.apply()
方法は、置換OutputT = PCollection<String>
と、適用されます。 OutputT
の実際の値を.apply()
の署名に代入した後、戻り値はPCollection<String>
です。
何が(POutput
に置き換えられるOutputT
)を型消去中に起こる言っている - Pipeline.apply()
の種類消去された署名がPOutput apply(String, PTransform)
です。コンパイルされたバイトコードのPipeline
の署名は、JVMが実際にそれを実行するときに関係しています。しかし、型消去は型検査の後ではなく、前に行われます。そうでなければ、ジェネリックを使用するほとんどすべてのJavaプログラムがコンパイルに失敗します。
これはまさにあなたがArrays.asList(1, 2, 3)
を呼び出すときに起こる同じものである - それは、型消去署名がList asList(Object[])
であっても、List<Integer>
はなくList<Object>
またはList
返します。
タイプTはコンパイル時に認識されます。 –
私が知っていると矛盾する - コンパイル時にTがその型に置き換えられた - 私たちのケースではPOutput – Andrei