Mi solución fue evitar las interfaces en el objeto persistente. Entonces BaseContract
se convirtió en lo siguiente:
public abstract class BaseContract<T extends Code> {
public abstract T getCode();
}
Y PersistentContract
fue implementado en términos de clases concretas:
public class PersistentContract extends BaseContract<CodeImpl> {
}
Esto parece lograr el equilibrio adecuado entre la codificación contra las interfaces en la clase base y la satisfacción de la necesidad de clases concretas de Spring Data.