2017-10-03 6 views
0

Dataflow의 Apache Beam 버전을 사용하고 있으며 제네릭 클래스를 출력하는 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

를 얻을 수 있습니다.

빔/데이터 흐름 핸들이 이와 같이 일반적인 클래스를 통과 할 수 있습니까? 가능한 경우, 현재 내가 뭘 잘못하고 있니?

+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을 사용하여 문제를 해결할 수있는 방법을 찾아 낼 수 있습니까?