それをより明確にする例:Gsonのシリアル化:ジェネリッククラスとジェネリックデータをその内部にキャストする方法は?
public class GsonDemo {
public static void main(String[] args) {
Gson gson = new Gson();
DataContainer<ExtendedData> dataContainer = new DataContainer<ExtendedData>();
dataContainer.data = new ExtendedData();
dataContainer.data.baseData = "base_data";
dataContainer.data.extraData = "extra_data";
String json = gson.toJson(dataContainer); // {"data":{"extraData":"extra_data","baseData":"base_data"}}
System.out.println(json);
json = gson.toJson(dataContainer, new TypeToken<DataContainer<Data>>() {}.getType());
System.out.println(json); // i don't want 'extraData' here. Why it steel serializing?
}
}
そして、私が使用するデータクラス:
class DataContainer<D extends Data> {
D data;
}
class Data {
String baseData;
}
class ExtendedData extends Data {
String extraData;
}
に私はDataContainer<Data>
にDataContainer<ExtendedData>
をキャストし、extraData
せずに、それをシリアル化します。私は指示TypeToken後に期待すること、
DataContainer<Data> castedDataContainer = (DataContainer<Data>) dataContainer; // Inconvertible types; cannot cast 'DataContainer<ExtendedData>' to 'DataContainer<Data>'
結果:{"data":{"baseData":"base_data"}}
しかしextraData
は、鋼製のシリアライズである私は実際DataContainer<ExtendedData>
をキャストすることはできません。何が間違っていたのですか?
私はここで違いを生むために単純なキャストを期待しません。私はあなたが明示的なコピーをする必要があると思います。 –