2017-04-05 28 views
8

我想实现一个基本的类来创建,读取,更新和删除对象。我确信我可以找到一个图书馆来做到这一点,但我自己做这件事是为了教育目的。Java重复通用定义

所以我把它说的是得救的一切都是实体,他们有一个特定类型的标识符:

interface Entity<T extends Serializable> extends Serializable 
{ 
    T getIdentifier(); 
} 

实体是序列化和识别码,以及。然后,我有我的EntityPersistor这应该保存实体从他们的内容(使用序列化)并从他们的密钥命名。我现在唯一执行的这个方法是将它们保存在磁盘上。它使用标识符作为文件的名称来保存它。

这里是我的实体persistor:

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>

+1

是不是假设'Product'是一个实体'? – Zircon

+0

@Zircon是的,编辑了这个问题 – Winter

回答

2

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

没有办法告诉编译器,方法的参数应该是对象TEntity)的“内部”通用类型。因此,你需要两个泛型:

一个用于指“内部”通用型的EntityK

而且一个实体本身:Entity<K>T

由于类型擦除,Java将无法在运行时找出参数类型K,而无需声明它。