假设我有这两个继承层次结构:
class EntityA { ... }
class EntityB extends EntityA { ... }
class EntityAPrime extends AbstractPrime<EntityA> { ... }
class EntityBPrime extends EntityAPrime { ... }
我也想要协变返回类型:
public class EntityA {
public EntityAPrime prime() {
return new EntityAPrime();
}
}
public class EntityB extends EntityA {
@Override
public EntityBPrime prime() {
return new EntityBPrime();
}
}
到目前为止,一切都很好。
问题是我想EntityBPrime
最终扩展AbstractPrime<EntityB>
,但由于它扩展EntityAPrime
它最终扩展AbstractPrime<EntityA>
。
我可以制作EntityAPrime
和EntityBPrime
通用,但后来我失去了协变返回类型:
public class EntityA {
public EntityAPrime<EntityA> prime() {
return new EntityAPrime();
}
}
public class EntityB extends EntityA {
@Override
public EntityBPrime<B> prime() { // ERROR: EntityBPrime extends EntityAPrime
return new EntityBPrime(); // but can't substitute <EntityB> for <EntityA>
}
}
如果我返回一个绑定的通配符,一切都会正常工作,但有与之相关的缺点,我将无法调用特定的 setter on AbstractPrime
。
EntityA
我的另一个想法是使EntityB
它们自己通用。
public class EntityA<T extends EntityA> {
public EntityAPrime<T> prime() { ... }
}
public class EntityB<T extends EntityB> extends EntityA<T> {
@Override
public EntityBPrime<T> prime() { ... }
}
这应该可行,但我认为它会变得混乱(我们有超过 100 个实体会使用类似的模式)。
那么,有没有办法:
- 保持协变回报
EntityA
不要在and上使用泛型EntityB
- 没有
prime()
返回绑定通配符 - 并
EntityBPrime
最终扩展AbstractPrime<EntityB>
而不是AbstractPrime<EntityA>
注意:主要类是生成的代码,但我可以控制生成的代码。