【问题标题】:Passing around generic classes in Dataflow在 Dataflow 中传递泛型类
【发布时间】:2017-10-03 23:50:24
【问题描述】:

我正在使用 Apache Beam 版本的 Dataflow,当我尝试创建输出泛型类的 PTransform 时遇到了问题。这是此类转换的一个最小示例,它只是重复输出一个类型。

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 可以像这样处理泛型类的传递吗?如果可以,我目前做错了什么?

【问题讨论】:

  • 请包括完整的异常堆栈跟踪,而不仅仅是消息。

标签: java generics google-cloud-dataflow apache-beam


【解决方案1】:

Class&lt;Type2&gt; 转换为Class&lt;Type1&gt; 不一定安全。即使Type2Type1 的子类,它也取决于[方差]( https://en.wikipedia.org/wiki/Covariance_and_contravariance_(computer_science)) 的 Class&lt;T&gt;Class&lt;Type2&gt; 是否是 Class&lt;Type1&gt; 的子类型,Class&lt;Type1&gt;Class&lt;Type2&gt; 的子类型,或者它们可能不相关。

您能否问一个关于您要解决的问题的问题,然后我们也许可以确定使用 Beam 完成该问题的方法?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-02-05
    • 2011-08-26
    • 1970-01-01
    • 1970-01-01
    • 2016-02-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多