0

私は次の構造を持っています:

public abstract class BaseVersionedEntity {
    private long id;

    private List<BaseRevision<? extends BaseVersionedEntity>> versions;

    public BaseRevision<? extends BaseVersionedEntity> getLatestRevision() {
        return versions.get(versions.size() - 1);
    }

    public abstract BaseRevision<? extends BaseVersionedEntity> newRevision();
}

public abstract class BaseVersionedEntityData<E> {
    private long id;

    private BaseRevision<E> revision;
}

public abstract class BaseRevision<E> implements Comparable<BaseRevision<E>> {
    private long id;
    private Timestamp timestamp;

    private E versionedEntity;
    private BaseVersionedEntityData<E> versionedEntityData;

    public BaseVersionedEntityData<E> getVersionedEntityData() {
        return versionedEntityData;
    }
}

これにより実装されます:

public class PersonEntity extends BaseVersionedEntity {

    @Override
    public BaseRevision<? extends BaseVersionedEntity> newRevision() {
        PersonRevision newRevision = new PersonRevision();
        newRevision.setTimestamp(new Timestamp(System.currentTimeMillis()));
        getRevisions().add(newRevision);
        return newRevision;
    }
}

public class PersonData extends BaseVersionedEntityData<PersonEntity> {

}

public class PersonRevision extends BaseRevision<PersonEntity> {

}

私のコードのどこかで、次の呼び出しを行います。

// is not null
PersonEntity personEntity;

PersonData personData = personEntity.getLatestRevision().getVersionedEntityData();

タイプの不一致でマークされているいくつかの理由から...

Type mismatch: cannot convert from BaseVersionedEntityData<capture#1-of ? extends BaseVersionedEntity> to PersonData

誰かが間違いを見つけることができますか?または何かヒントがありますか?

ありがとうございました!!ベンジャミン

4

1 に答える 1

1

このメソッドは、を返しgetLatestRevisionません。またPersonRevision、を返しますがBaseRevision、それでもPersonRevision戻りませんPersonData。これはダウンキャストであり、型消去によって引き起こされる「安全な」ダウンキャストの1つでもないため、明示的なキャストが必要になります。

PersonData personData = (PersonData)(personEntity.getLatestRevision().getVersionedEntityData());
于 2012-12-06T21:52:23.663 に答える