我想做类似的事情:
PCollection<String> a = whatever;
PCollection<KV<String, User>> b = a.apply(
MapElements.into(TypeDescriptor.of(KV<String, User>.class))
.via(s -> KV.of(s, new User(s))));
其中User是一个自定义数据类型,带有Arvo编码器和一个将字符串考虑在内的构造函数。
但是,出现以下错误:
无法从参数化类型中选择
我尝试将其更改为TypeDescriptor.of(KV.class)
,但随后得到:
不兼容的类型;必需的PCollection>,但是将“ apply”推断为OutputT:不存在类型变量的实例,因此PCollection符合PCollection>
那我该怎么KV
用MapElements
呢?
我知道我想做的事是可行的,ParDo
因为我可以通过清除来明确指定如何进行类型擦除,new DoFn<String, KV<String, User>>
但ParDo
不支持lambda函数。当我们使用Java 8时,这似乎不太优雅。
由于在编译过程中Java中的类型擦除,由于类型变量已被擦除,因此KV<String, User>.class
在转换过程中转换为,KV.class
并且在运行时KV.class
信息不足以推断编码器。
要解决此限制,您需要使用一种在编译后保留类型信息的机制。例如,您可以使用:
TypeDescriptors.kvs(TypeDescriptors.strings(), TypeDescriptor.of(User.class))
这与提供您自己的匿名类相同:
new TypeDescriptor<KV<String, User>> {}
提供绑定了类型变量的匿名类是当前在Java中解决类型擦除的方法之一。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句