У меня есть два интерфейса и класса:
public interface Identifiable<T> {
T getId();
}
public interface GenericRepository<T extends Identifiable<K>, K> {
T get(K id);
}
public class MyEntity implements Identifiable<Long> {
private Long id;
public Long getId() {
return id;
}
}
public class MyService {
private GenericRepository<MyEntity, Long> myEntityRepository;
}
Все работает как надо. Но на мой взгляд второй общий параметр в GenericRepository (K) избыточен. Поскольку я знаю, что MyEntity является идентифицируемым, я думаю, что было бы здорово, если бы я мог, наконец, использовать его следующим образом:
public class MyService {
private GenericRepository<MyEntity> myEntityRepository;
}
Но я пробую разные вещи, но безуспешно. Является ли это возможным? Если нет, то почему?
ОБНОВЛЕНИЕ: Отвечаю на некоторые ответы. Я думаю, что компилятор знает что-то о том, какой тип является универсальным в MyEntity. Например:
public class MyEntityGenericRepository implements GenericRepository<MyEntity, Long> {
// compiles...
}
public class MyEntityGenericRepository implements GenericRepository<MyEntity, String> {
// compiler says: "Bound mismatch: The type MyEntity is not a valid substitute for the bounded parameter <T extends Identifiable<K>> of the type GenericRepository<T,K>"
}