Я использую наследование java для создания суперкласса Player и подкласса Guest, который расширяет Player. Более того, я пытаюсь сохранить свой собственный список Player в формате json благодаря sharedPreferences и после этого вернуть его в формат списка. Я использую Gson для этого, но у меня следующая ошибка:
java.lang.RuntimeException: Unable to invoke no-args constructor for class fr.frenchapplab.partydrink.Model.Player. Registering an InstanceCreator with Gson for this type may fix this problem.
Caused by: java.lang.UnsupportedOperationException: Abstract class can't be instantiated! Class name: fr.frenchapplab.partydrink.Model.Player
Это мой код для сохранения и извлечения данных:
private void savePlayers() {
Type listType = new TypeToken<ArrayList<Player>>() {}.getType();
String json = gson.toJson(players, listType);
PreferenceManager.getDefaultSharedPreferences(requireContext()).edit().putString(KEY_SAVE_PLAYERS, json).apply();
}
private List<Player> loadPlayers() {
String json = PreferenceManager.getDefaultSharedPreferences(requireContext()).getString(KEY_SAVE_PLAYERS, "");
if (!json.isEmpty()) {
Type listType = new TypeToken<ArrayList<Player>>(){}.getType();
List<Player> players = gson.fromJson(json, listType);
if (players != null && players.size() > 0)
return players;
}
return new ArrayList<>();
}
И это мой суперкласс и мой подкласс:
public abstract class Player implements Parcelable {
private String playerName;
private int game_drink_count;
public Player(String playerName) {
this.playerName = playerName;
}
public String getPlayerName() {
return playerName;
}
public void setPlayerName(String playerName) {
this.playerName = playerName;
}
public int getGame_drink_count() {
return game_drink_count;
}
public void setGame_drink_count(int game_drink_count) {
this.game_drink_count = game_drink_count;
}
// Parcelling part
public Player(Parcel in) {
this.playerName = in.readString();
}
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(this.playerName);
}
}
public class Guest extends Player {
public Guest(String playerName) {
super(playerName);
}
public Guest(Parcel in) {
super(in);
}
public static final Parcelable.Creator<Guest> CREATOR = new Parcelable.Creator<Guest>() {
public Guest createFromParcel(Parcel in) {
return new Guest(in);
}
public Guest[] newArray(int size) {
return new Guest[size];
}
};
public int describeContents() {
return 0;
}
}