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>
通常会有一种方法可以删除一个或另一个,但问题是您同时使用 K
和 T
作为参数类型。
没有办法告诉编译器方法的参数应该是对象的"inner"泛型类型T
(Entity
)。因此,您需要两个泛型:
一个用于引用 Entity
(K
)
的 "inner" 泛型
还有一个用于实体本身:Entity<K>
(T
)
由于类型擦除,Java 在没有您声明的情况下无法在运行时计算出参数类型 K
。
我正在尝试实现一个基本的 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>
通常会有一种方法可以删除一个或另一个,但问题是您同时使用 K
和 T
作为参数类型。
没有办法告诉编译器方法的参数应该是对象的"inner"泛型类型T
(Entity
)。因此,您需要两个泛型:
一个用于引用 Entity
(K
)
还有一个用于实体本身:Entity<K>
(T
)
由于类型擦除,Java 在没有您声明的情况下无法在运行时计算出参数类型 K
。