Java 泛型通配符类型不匹配

标签 java generics type-mismatch

我有以下结构:

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

有人能发现错误吗?或者有什么提示吗??

谢谢!! 本杰明

最佳答案

方法 getLatestRevision 不会返回 PersonRevision,而是返回 BaseRevision,即使如此,PersonRevision 也不会返回不返回PersonData - 您需要显式转换,因为这是一个向下转换,甚至不是由类型删除引起的“安全”向下转换之一:

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

关于Java 泛型通配符类型不匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13753141/

相关文章:

java - 连接池的MySQL实现

python - 通用迭代器注释 Python

Haskell 从 IO 域获取值

java - 在 GWT 中, "[...].java' is removed due to invalid reference(s)”是什么意思?

Java:String 对象的线程安全

java - 显示一个 ImageIcon

java - 将 Map 的 Map 更改为泛型类型

json - WCF - 泛型类的 DataMember 的自定义名称

Scala 错误 : Found List[Char], 需要列表 [ScalaObject]

perl - DBD::SQLite::st 执行失败:数据类型不匹配