gpt4 book ai didi

java - 使用反射调用 Type 参数化方法

转载 作者:行者123 更新时间:2023-11-29 03:01:35 24 4
gpt4 key购买 nike

google cloud dataflow sdk 有一个类可以为不同的 Avro 类型注册编码器。

CoderRegistry cr = p.getCoderRegistry();
cr.registerStandardCoders();
cr.registerCoder(Row.class, AvroCoder.of(Row.class));
cr.registerCoder(Destination.class, AvroCoder.of(Destination.class));
cr.registerCoder(Device.class, AvroCoder.of(Device.class));
cr.registerCoder(Location.class, AvroCoder.of(Location.class));
cr.registerCoder(Source.class, AvroCoder.of(Source.class));
cr.registerCoder(DimensionalMetric.class, AvroCoder.of(DimensionalMetric.class));
cr.registerCoder(DimensionSet.class, AvroCoder.of(DimensionSet.class));
cr.registerCoder(MetricSet.class, AvroCoder.of(MetricSet.class));

但是你可以想象这会变得非常麻烦,我想使用 java 反射 API 自动注册包 com.brightcove.rna.model 中的所有类。我想这看起来像这样:

void registerAllModels(Pipeline p) {
CoderRegistry cr = p.getCoderRegistry();
Reflections r = new Reflections("com.brightcove.rna.model");
Set<Class<? extends IndexedRecord>> classes = r.getSubTypesOf(IndexedRecord.class);
for (Class<? extends IndexedRecord> clazz : classes) {
cr.registerCoder(clazz, AvroCoder.of(clazz));
}
}

不幸的是,这不起作用。我在这里做错了什么?

最佳答案

您在以下行中有一个编译错误:

cr.registerCoder(clazz, AvroCoder.of(clazz));

错误是:

The method registerCoder(Class<?>, Class<?>) in the type CoderRegistry is not applicable for the arguments (Class<capture#1-of ? extends IndexedRecord>, AvroCoder<capture#2-of ? extends IndexedRecord>).

基本上,问题是 Java 编译器无法推断两个参数上的通配符类型相同,因此会报告错误。这是一个常见的 Java 问题,请参阅 this例如问题。

修复如下,它可能需要您抑制有关原始类型和未经检查的转换的编译器警告:

  cr.registerCoder(clazz, (Coder) AvroCoder.of(clazz.newInstance().getSchema()));

这解决了两个问题:

  • 确保 registerCoder(Class<T>, Coder<T>)使用而不是重载 registerCoder(Class<?>, Class<?>) .
  • AvroCoder.of(Class<T>)使用 Avro 的 ReflectData.get().getSchema()生成一个模式,它可能不适用于所有类型,例如 GenericRecord .另一种方法是通过 AvroCoder.of(Schema) 构建编码器并从自动生成的类中获取架构。

关于java - 使用反射调用 Type 参数化方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34504122/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com