que tienen estas dos interfaces y clases:parámetros genéricos redundantes
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;
}
todo funciona como se desea. Pero, en mi opinión, el segundo parámetro genérico en GenericRepository (K) es redundante. Porque sé que es un myEntity identificable, creo que sería muy bueno si por fin puedo utilizar de esta manera:
public class MyService {
private GenericRepository<MyEntity> myEntityRepository;
}
Pero estoy tratando cosas diferentes sin tener éxito. ¿Es posible? ¿Si no, porque no?
ACTUALIZACIÓN: Respondiendo algunas respuestas. Creo que el compilador sabe algo sobre qué tipo es el genérico en MyEntity. Por ejemplo:
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>"
}
Gracias, pero no estoy de acuerdo . Por favor, mira mi edición. – sinuhepop
@sinuhepop, por supuesto, el compilador puede verificar que el tipo real de 'K' coincida con el del parámetro de tipo en' Identificable '. Aún así, necesita * declarar * K como un parámetro de tipo genérico (y, en consecuencia, pasar su valor real en el momento de la instanciación). Así es como funciona el lenguaje. Tienes razón de que este conocimiento * podría * en teoría ser inferido por el compilador, pero no es por ahora, y por muchos años aún ... si es que alguna vez (desafortunadamente, el desarrollo de Java se mueve muy lentamente hacia esa dirección. ..). –