在下面的代码中:
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
,在运行时丢失)。