Java重复泛型定义

标签 java generics crud

我正在尝试实现一个基本类来创建、读取、更新和删除对象。我确定我可以找到一个图书馆来做这件事,但我是出于教育目的自己做的。

所以我让所有被保存的东西都是实体,并且它们有一个特定类型的标识符:

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>

最佳答案

通常会有一种方法可以删除一个或另一个,但问题是您同时使用了 KT作为参数类型。

无法告诉编译器方法的参数应该是对象的“内部”泛型类型 T (Entity)。因此,您需要两个泛型:

一个用于引用 Entity 的“内部”通用类型( K )

还有一个用于实体本身:Entity<K> ( T )

由于类型删除,Java 无法确定参数类型 K在运行时没有你的声明。

关于Java重复泛型定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43235617/

相关文章:

java - 如何通过javascript查找系统区域时区名称

java - 必需的 ? 类型捕获,提供 T

java - 带有列表和 putIfAbsent 的通用 HashMap

rest - 为什么 REST 动词不一定对应于 CRUD 操作?

php - Codeigniter 通过在 uri 中传递 id 来更新数据库行

java - Matlab无法启动,错误: "Cannot locate com/mathworks/jmi/OpaqueJavaInterface class"

java - 用 Java 实现 IM 平台

java - Netbean Java Swing、JPanel/Jlabel 无法覆盖整个框架

java - 如何在java中调用带有嵌套泛型的构造函数

user-interface - 面向业务的繁重数据输入 (CRUD) 应用程序 GUI 设计的好例子