Solusi saya adalah menghindari antarmuka sama sekali di objek persisten. Jadi BaseContract
menjadi sebagai berikut:
public abstract class BaseContract<T extends Code> {
public abstract T getCode();
}
Dan PersistentContract
diimplementasikan dalam bentuk kelas konkret:
public class PersistentContract extends BaseContract<CodeImpl> {
}
Ini tampaknya mencapai keseimbangan yang tepat antara pengkodean terhadap antarmuka di kelas dasar dan memenuhi kebutuhan Spring Data untuk kelas konkret.