11

私はこのコードスニペットを持っています:

public abstract class Repository<Entity extends BaseObject> {

...

public void readFromJson(){
    String content = "JSON content here";
    Gson gson = new Gson();
    Type entityType = new TypeToken<JSONObject<Entity>>(){}.getType();

    jsonObject = gson.fromJson(content, entityType);

    for (Entity ent : jsonObject.getEntities()) ;
    }
}

foreach を実行しようとすると、エンティティ オブジェクトのタイプが Entity ではなく LinkedHashMap になり、次の例外が発生します: java.lang.ClassCastException: java.util.LinkedHashMap cannot be cast to com.tranca.bookstore.domain.shared.BaseObject

これがJSONObjectクラスです(私が作成しました)

public class JSONObject<Entity> {

private List<Entity> entities = new ArrayList<Entity>();
private long lastId = -1;
public List<Entity> getEntities() {
    return entities;
}
public void setEntities(List<Entity> entities) {
    this.entities = entities;
}
public long getLastId() {
    return lastId;
}
public void setLastId(long lastId) {
    this.lastId = lastId;
}

public void incrementLastId() {
    this.lastId++;
}

}

ベースオブジェクトが関連している可能性があるため、ここにコードを配置します。

public abstract class BaseObject implements Serializable {

protected long id = (long) -1;
protected int version = 0;

protected BaseObject(){}

public long getId() {
    return id;
}
public void setId(long id) {
    this.id = id;
}
public int getVersion() {
    return version;
}
public void setVersion(int version) {
    this.version = version;
}

}
4

2 に答える 2

2

ついに手に入れました!

問題は次のことでした。

新しい TypeToken< JSONObject< エンティティ>>(){}.getType();

Repository を拡張していたサブクラスの特定のエンティティではなく、JSONObject< T> のタイプを返します (たとえば、UserRepository は Repository< User> を拡張します)。

秘訣は、サブクラスに逆シリアル化の Type を強制的に設定する抽象メソッドを作成することでした。

結論として、このエラーが発生した場合は、適切なタイプのクラスがあることを確認してください (サブクラスを使用する場合は、スーパークラスではなくサブクラスのタイプを返すことを確認してください)。

于 2012-04-09T21:33:40.383 に答える