java - 使用带有扩展的泛型的接口(interface)中重写方法的返回类型的意外行为

标签 java generics type-parameter

我有以下通用接口(interface):

public interface Builder<T> {
    public T getObject();
}

类(class)EntityBuilder实现此接口(interface):

public class EntityBuilder<E extends Entity> implements Builder<E> {
    ...
    @Override
    public E getObject() {
        return new Entity(ID, creationTime, lastChangeTime);
    }
    ...
}

哪里Entity是一个简单的 DTO:

public class Entity {
    ...
    public Entity(long ID, Date creationTime, Date lastChangeTime) {
        ID = ID;
        this.creationTime = creationTime;
        this.lastChangeTime = lastChangeTime;
    }
    ...

我遇到的问题是 public E getObject()"cannot convert from Entity to E" ,但是,声明<E extends Entity>断言 E 是一个实体(或子类),该实体显然是。

我错过了什么?

旁注:我当然可以将其简化为 EntityBuilder implements Builder<Entity> ,但后来我无法以 PersonBuilder extends EntityBuilder<Person> (implements Builder<Person>) 之类的方式扩展 EntityBuilder , IE。我会错过 PersonBuilder 的断言实现Builder<Person> 。也许有一个更优雅的解决方案,它也可以解决上述问题。

最佳答案

我相信您收到该错误是因为您返回了一个实体。您说 E 应该是一个实体,但这并不一定意味着您返回的实体是 E (有点像正方形是矩形,但矩形不一定是正方形)。我相信您可以通过将返回类型转换为 return (E) new Entity(ID,creationTime,lastChangeTime);

来修复它

关于java - 使用带有扩展的泛型的接口(interface)中重写方法的返回类型的意外行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28654103/

相关文章:

java - GUI 加载后,如何在 Raspberry Pi 上启动时运行程序?

java - 泛型类型声明导致错误

java - 什么时候需要 Some<E extends Some<E>> 而不是 Some<E extends Some>?

Java 泛型 : wildcard and type parameter syntax when defining generic class

java - Jackson:Map的反序列化

java - 对于这个层次结构来说,最好的基于对象的数据结构是什么?

java - RunWith(PowerMockRunner.class) 不适用于包注释

java - 如何定义构建器模式层次结构,其中可以按任何顺序调用 setter

Java 无法访问子类重新定义的方法中的顶级属性

java - 如何处理重复的类型参数?