0

在下面的代码中:

    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
4

1 回答 1

0

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

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

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

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

实际上,黑色巫毒魔法线通过反射获得实例化类时使用的通用参数的类型。您必须基于实例来执行此操作,因为在定义类时您不知道参数的类型(因为泛型是 asyntactic sugar并且在运行时丢失)。

于 2013-03-13T20:24:10.433 回答