我正在尝试实现一个基本类来创建、读取、更新和删除对象。我确定我可以找到一个图书馆来做这件事,但我是出于教育目的自己做的。
所以我让所有被保存的东西都是实体,并且它们有一个特定类型的标识符:
interface Entity<T extends Serializable> extends Serializable
{
T getIdentifier();
}
实体是可序列化的,它们的标识符也是如此。然后,我有我的 EntityPersistor
它应该从它们的内容中保存实体(使用序列化)并从它们的键中命名它们。我目前对这个持久化器的唯一实现是将它们保存在磁盘上。它使用标识符作为将其保存到的文件的名称。
这是我的实体持久化:
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();
}
所以,问题是当我想使用它时,我必须重新定义 key 的类型两次。我想写:
interface EntityPersistor<T extends Entity<K extends Serializable>> extends Iterable<T>
但它会产生一个编译器错误。所以我必须这样使用它:
EntityPersistor<String, Product> persistor = new FileEntityPersistor<>();
这很不方便。
是否有解决方法或更好的方法来做到这一点?我觉得这会降低我的声明的可读性,但用法更重要。
编辑:
我忘了说 class Product implements Entity<String>
最佳答案
通常会有一种方法可以删除一个或另一个,但问题是您同时使用了 K
和 T
作为参数类型。
无法告诉编译器方法的参数应该是对象的“内部”泛型类型 T
(Entity
)。因此,您需要两个泛型:
一个用于引用 Entity
的“内部”通用类型( K
)
还有一个用于实体本身:Entity<K>
( T
)
由于类型删除,Java 无法确定参数类型 K
在运行时没有你的声明。
关于Java重复泛型定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43235617/