web-dev-qa-db-ja.com

ジェネリック型引数から.classを取得できますか?

私は次のクラスを持っています:

public abstract class MyClass<T extends Object> {

    protected T createNewFromData(Reader reader){
        GSON.fromJSON(reader,T.class); // T.class isn't allowed :(
    }
}

Class <T>インスタンスをそこに渡すにはどうすればよいですか?奇妙で奇抜な回避策はありますか?

タイプTの事前にインスタンス化されたオブジェクトから以外にClass <T>参照を取得する方法はありますか?それは私にもこれをさせません:

T t = new T();
Class<T> klass = t.class;

試行#2

興味深いことに、クラス定義から「extends JSONOBjBase」を削除すると、チェックされていないキャストWARNINGが表示されます(エラーなし)。キャストがどのように行われるかを書く別の方法はありますか?

Eclipse screenshot

17
Mike S

または、 Class をコンストラクター引数として送信し、T.classを取得する代わりにそのオブジェクトを使用することもできます。

public abstract class MyClass<T extends Object> {

    private Class<T> klass;

    public MyClass(Class<T> klass) {
        this.klass = klass;
    }

    protected T createNewFromData(Reader reader){
        GSON.fromJSON(reader,klass); 
    }
}
6

番号。
型消去のため、この情報は実行時に存在しません。

代わりに、GSONの TypeToken hack を再利用できます。これにより、閉じたジェネリック基本クラスを継承する匿名クラスが作成されます。

9
SLaks

この種のことは、上記のアレックスによって与えられた答えを反映しています。これは、jacksonライブラリを使用して一般的なjson-> POJOラッパーを記述しているサンプルコードです。

/* Method that reads json string from a file, and maps it to an instance of the class passed in as the second argument. */


public static <T> T getObjectMappedFromJsonInFile(String fileName, Class<T> clazz){

    ObjectMapper mapper=new ObjectMapper();

    File file=new File(fileName);

    try{

        JsonNode jsonNode=mapper.readTree(file);

        T response=mapper.convertValue(jsonNode,clazz);

        return response;
    }catch (Exception e){

        log.error("Error reading transactions.json file",e);

    }
    return null;

}

そして、これが私がそれを呼ぶ方法です:

TransactionsResponse response=getObjectMappedFromJsonInFile(fileName,TransactionsResponse.class);
0
apil.tamang

OK。これはあなたがそれをするべき方法です:

      public abstract class MyClass <T> {

        public T createNewFormData(Reader reader, Class<T> clazz){
        return GSON.fromJSON(reader, clazz);
        }
      }

      public class ImplementMyClass extends MyClass<Long>{
      }

そしてそれをこのように呼んでください:

            MyClass<Long> cls = new ImplementMyClass();


    Socket s = null;
    try {
        s = new  Socket("localhost", 8080);
    } catch (Exception e) {
        e.printStackTrace();
        return;
    }
    InputStream i = null;
    try {
        i = s.getInputStream();
    } catch (IOException e) {
        e.printStackTrace();
    }
    InputStreamReader reader = new InputStreamReader(i);
    cls.createNewFormData(reader, Long.class);
0