2017-08-07 2 views
3

私は、単純なジェネリッククラスを持っている:ジェネリックメソッド渡しparramaters - とjava.lang.ClassCastException:com.google.gson.internal.LinkedTreeMap

public class OwnedCollection<T extends BaseObject> extends BaseObject { 

    private String playerId; 
    private List<T> collection; 


public OwnedCollection(String playerId, List<T> collection) { 
    super(playerId); 
    this.playerId = playerId; 
    this.collection = collection; 
} 

}

私はJSONからそれをデシリアライズします。

OwnedCollection<Skin> fromJson = new Gson().fromJson(json, new TypeToken<OwnedCollection<Skin>>() {}.getType()); 

すべてが正常に動作している:私は、私はラインを呼び出すとそう 、Gsonライブラリを使用しています。

しかし、私はこれを行うためのメソッドを作成しようとすると例外が発生します。 私は次のことを試してみました:

public <T extends BaseObject> OwnedCollection<T> deserialize1(String json, Class<T> type) { 
    Gson gson = new Gson(); 
    return gson.fromJson(json, new TypeToken<T>() { 
    }.getType()); 
} 

し、それを呼び出す:

OwnedCollection<Skin> deserialize1 = deserialize1(json, Skin.class); 

私が手:

その後、
java.lang.ClassCastException: org.miracledojo.karatedo.domen.item.Skin cannot be cast to org.miracledojo.karatedo.domen.item.OwnedCollection 

public <T extends BaseObject> OwnedCollection<T> deserialize2(String json, Type type) { 
    Gson gson = new Gson(); 
    return gson.fromJson(json, type); 
} 

し、それを呼び出します:

deserialize2(json, Skin.class); 

その後、私が手:

java.lang.ClassCastException: org.miracledojo.karatedo.domen.item.Skin cannot be cast to org.miracledojo.karatedo.domen.item.OwnedCollection 

誰もが任意のアイデアを持っていますか?以下のような 何か:

OwnedCollection<Skin>.class 

はできないので、任意の同様のsintax?あなたは `deserialize1`に`新しいTypeToken > `を使用する必要がありますように

+1

ルックスメソッドの代わりに 'new TypeToken ' –

+0

@IvanProninを使用しています。この方法ではシリアル化できますが、適切なオブジェクトではできません。ジェネリッククラスのメソッドを呼び出そうとすると、java.lang.ClassCastExceptionが発生します。com.google.gson.internal.LinkedTreeMapはorg.miracledojo.karatedo.domen.BaseObjectにキャストできません –

答えて

1

あなたはトークンGSONパーサに誤ったタイプを与えている、型TのOwnedCollectionするタイプのトークンを変更

public <T extends BaseObject> OwnedCollection<T> deserialize1(String json, Class<T> type) { 
    return new Gson().fromJson(json, new TypeToken<OwnedCollection<T>>(){}.getType()); 
} 
+0

私はそれをシリアル化できますその方法ではありますが、適切なオブジェクトにはありません。ジェネリッククラスのメソッドを呼び出そうとすると、java.lang.ClassCastExceptionが発生します。com.google.gson.internal.LinkedTreeMapはorg.miracledojo.karatedo.domen.BaseObjectにキャストできません。 –