Benjamin Ihrig
Benjamin Ihrig

Reputation: 271

Java Generics Wildcards Type Mismatch

I have the following structure:

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;
    }
}

That will be implemented by this:

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> {

}

Somewhere in my code i'll do the following call:

// is not null
PersonEntity personEntity;

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

Out of some reasons that is marked with a type mismatch...

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

Can anyone find a mistake?? Or have any hints??

Thank you!! Benjamin

Upvotes: 0

Views: 269

Answers (1)

Jeff
Jeff

Reputation: 12785

The method getLatestRevision does not return a PersonRevision, it returns a BaseRevision, and even then PersonRevision doesn't return PersonData - you'll need an explicit cast since this is a downcast, and not even one of the "safe" caused-by-type-erasure downcasts:

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

Upvotes: 1

Related Questions