比方說,我有這兩個繼承層次:Java的並行繼承層次與泛型和協變返回
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>
}
}
一切正常,如果我回到一個綁定的通配符,但有一個與此有關disadvantages,我不會能夠調用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
和EntityB
- 仿製藥沒有
prime()
返回一個綁定的通配符 - ,並有
EntityBPrime
最終延長AbstractPrime<EntityB>
代替AbstractPrime<EntityA>
注意:素數類是生成的代碼,但我可以控制生成的代碼。
除非您打破A和B之間的繼承關係,您可以使用組合嗎? –
@EricStein這些實體是在繼承的基礎上建模的,並以這種方式映射到表。雖然這真的很好。 –
我想你就是在這條小溪上。擴展再次敲擊。 :-( –