2017-10-03 8 views
0

私はApache BeamバージョンのDataflowを使用していますが、ジェネリッククラスを出力するPTransformを作成しようとすると、現在問題が発生しています。このような変換の最小の例があります。これは単に型を繰り返し出力します。Dataflowでジェネリッククラスを渡す

public class BadTransform 
    extends PTransform<PCollection<Result>, PCollection<Class<? extends Type1>>> { 

    @Override 
    public PCollection<Class<? extends Type1>> expand(
     PCollection<Result> input) { 
    return input.apply(
     ParDo.of(
      new DoFn<Result, Class<? extends Type1>>() { 
       @ProcessElement 
       public void processElement(ProcessContext processContext) throws Exception { 
       processContext.output(Type2.class); 
       } 
      })); 
    } 
} 

これは問題なくコンパイルを変換するが、実行すると、エラーメッセージjava.lang.ClassCastException: org.apache.beam.sdk.repackaged.com.google.common.reflect.Types$WildcardTypeImpl cannot be cast to java.lang.reflect.TypeVariable

が、私はこのための任意の専門的なコーダを持っていない生み出します。

Beam/Dataflowハンドルは、このような汎用クラスを渡すことができますか?可能であれば、私は現在何を間違っていますか?

+0

メッセージだけでなく、完全な例外スタックトレースを含めてください。 – jkff

答えて

0

Class<Type2>Class<Type1>にキャスティングすることは必ずしも安全ではありません。 Type2Type1のサブクラスであっても、それはClass<Type2>Class<Type1>のサブタイプであるか否かのClass<T>の[分散]( https://en.wikipedia.org/wiki/Covariance_and_contravariance_(computer_science))に依存し、Class<Type1>Class<Type2>のサブタイプであるか、またはそれらがunrelatableであってもよいです。

代わりに、解決しようとしている問題について質問してもらえますか?次に、Beamを使用して問題を解決する方法を特定できますか?

関連する問題