我有以下通用接口(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/