Estoy tratando de implementar una clase básica para crear, leer, actualizar y eliminar objetos. Estoy seguro de que podría encontrar una biblioteca para hacer eso, pero lo estoy haciendo yo mismo con fines educativos.
Así que hice que todo lo que se guarda son entidades y tienen un identificador de un tipo específico:
interface Entity<T extends Serializable> extends Serializable { T getIdentifier(); } Las entidades son serializables y su identificador también. Luego, tengo mi EntityPersistor que se supone que debe guardar la entidad de su contenido (usando serialización) y nombrarlos de su clave. Mi única implementación de este persistente por ahora es guardarlos en el disco. Está utilizando el identificador como el nombre del archivo para guardarlo.
Aquí está mi entidad persistente:
interface EntityPersistor<K extends Serializable, T extends Entity<K>> extends Iterable<T> { void save(T entity); void delete(T entity); void deleteById(K id); T getById(K id); boolean contains(K id); List<T> loadAll(); }Entonces, el problema es que tengo que redefinir el tipo de clave dos veces cuando quiero usarla. Me gustaría escribir:
interface EntityPersistor<T extends Entity<K extends Serializable>> extends Iterable<T>pero arroja un error del compilador. Así que tengo que usarlo de esa manera:
EntityPersistor<String, Product> persistor = new FileEntityPersistor<>();lo cual es inconveniente.
¿Hay una solución alternativa o una mejor manera de hacerlo? Siento que hará que mi declaración sea menos legible, pero el uso es más importante.
EDITAR:
Olvidé mencionar que la class Product implements Entity<String>
Normalmente, habría una forma de eliminar uno u otro, pero el problema es que está utilizando tanto K como T como tipos de parámetros.
No hay forma de decirle al compilador que el parámetro de un método debe ser el tipo genérico "interno" del objeto T (La Entity ). Por lo tanto, necesita dos genéricos:
Uno para referirse al tipo genérico "interior" de la Entity ( K )
Y uno para la propia entidad: Entity<K> ( T )
Debido al borrado de tipo, Java no podría descifrar el tipo de parámetro K en tiempo de ejecución sin su declaración.