Mijn oplossing was om interfaces in het persistente object helemaal te vermijden. Dus BaseContract
werd het volgende:
public abstract class BaseContract<T extends Code> {
public abstract T getCode();
}
En PersistentContract
werd geïmplementeerd in termen van concrete klassen:
public class PersistentContract extends BaseContract<CodeImpl> {
}
Dit lijkt de juiste balans te vinden tussen coderen tegen interfaces in de basisklasse en voldoen aan de behoefte van Spring Data aan concrete klassen.