Моето решение беше изобщо да избягвам интерфейсите в постоянния обект. Така че BaseContract
стана следното:
public abstract class BaseContract<T extends Code> {
public abstract T getCode();
}
И PersistentContract
е реализиран по отношение на конкретни класове:
public class PersistentContract extends BaseContract<CodeImpl> {
}
Това изглежда постига правилния баланс между кодиране срещу интерфейси в базовия клас и задоволяване на нуждите на Spring Data от конкретни класове.