Mým řešením bylo vyhnout se rozhraním v trvalém objektu. Takže BaseContract
se stal následujícím:
public abstract class BaseContract<T extends Code> {
public abstract T getCode();
}
A PersistentContract
byla implementována z hlediska konkrétních tříd:
public class PersistentContract extends BaseContract<CodeImpl> {
}
Zdá se, že to vytváří správnou rovnováhu mezi kódováním proti rozhraním v základní třídě a uspokojením potřeby Spring Data po konkrétních třídách.