19

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

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」を削除すると、チェックされていないキャスト警告 (エラーなし) が返されます。キャストがどのように行われるかを書く別の方法はありますか?

日食のスクリーンショット

4

4 に答える 4

12

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

代わりに、クローズド ジェネリック基本クラスを継承する匿名クラスを作成するGSON のTypeToken ハックを再利用できます。

于 2012-09-21T03:09:14.653 に答える
8

または、クラスをコンストラクター引数として送信し、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); 
    }
}
于 2012-09-21T03:36:48.577 に答える
0

わかった。これはあなたがそれを行うべき方法です:

      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);
于 2012-09-28T04:42:19.967 に答える