在Avro的反射中使用泛型



在下面的代码中:

    public class AvroReader<T> {
    public AvroReader(Class type, File packetFile) throws IOException{
            reader = new DataFileReader<>(packetFile,
                    new ReflectDatumReader<T>(ReflectData.get().getSchema(type)));
    }
}

我想在构造函数中去掉字段"type",因为type=T.class。如果编译器接受getSchema(T.class) !

一个建议是使用:

Class<T> cls = (Class<T>) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0];

我得到这个错误:

java.lang.Class cannot be cast to java.lang.reflect.ParameterizedType

您需要使用下面的黑魔法巫毒来检索泛型参数的类:

Class<T> persistentClass = (Class<T>) (getClass().getGenericSuperclass());

然后你可以像这样转换你的代码

Schema schema = ReflectData.get().getSchema(persistentClass);

实际上,黑色巫术行是通过反射获得实例化类时使用的泛型参数的类型。你必须基于实例来做,因为当你定义你的类时,你不知道你的参数的类型(因为泛型是syntactic sugar,在运行时丢失)。

相关内容

  • 没有找到相关文章

最新更新