Java 重复通用定义

Java duplicate generic definition

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

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

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();
}

所以,问题是当我想使用它时,我必须重新定义密钥的类型两次。我想写:

interface EntityPersistor<T extends Entity<K extends Serializable>> extends Iterable<T>

但它会产生编译器错误。所以我必须这样使用它:

EntityPersistor<String, Product> persistor = new FileEntityPersistor<>();

不方便。

是否有解决方法或更好的方法?我觉得这会降低我的声明的可读性,但用法更重要。

编辑:

我忘了说 class Product implements Entity<String>

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

没有办法告诉编译器方法的参数应该是对象的"inner"泛型类型TEntity)。因此,您需要两个泛型:

一个用于引用 Entity (K)

的 "inner" 泛型

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

由于类型擦除,Java 在没有您声明的情况下无法在运行时计算出参数类型 K