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=T.class であるため、コンストラクターのフィールド「type」を廃止したいと思います。コンパイラが getSchema(T.class) を受け入れた場合のみ!

1 つの提案は、次を使用することでした。

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);

実際、黒いブードゥー教の魔法のラインは、クラスをインスタンス化するときに使用されるジェネリック引数の型をリフレクションによって取得しています。クラスを定義するときにパラメーターのタイプがわからないため、インスタンスに基づいて行う必要があります(ジェネリックはsyntactic sugar実行時に失われるため)。

于 2013-03-13T20:24:10.433 に答える