2017-04-05 13 views
8

私はオブジェクトを作成、読み込み、更新、削除するための基本クラスを実装しようとしています。私はそれを行うためのライブラリを見つけることができると確信していますが、私は教育目的のためにそれを自分でやっています。Java duplicate generic definition

だから私は救われ、すべてがエンティティであり、彼らは、特定のタイプの識別子を持っていること、それを作った:

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

だから、問題は、私はそれを使用したい場合、私は二回キーのタイプを再定義する必要がある。

は、ここに私のエンティティpersistorです。私は書いています:

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

しかし、コンパイラエラーが発生します。ですから、私はそれをそのように使用しなければなりません:

これは不都合です。

これを回避する方法がありますか?宣言の読みやすさが分かりにくくなるような気がしますが、使い方が重要です。

EDIT:

私はclass Product implements Entity<String>

+1

'Product'が' Entity 'であるとしますか? – Zircon

+0

@Zirconはい、質問を編集しました – Winter

答えて

2

は、通常はどちらか一方を削除する方法があるだろうが、問題はあなたがパラメータの型としてKTの両方を使用していることであることを言及するのを忘れてしまいました。

メソッドのパラメータがオブジェクトの "内部"の汎用型であることをコンパイラに伝える方法はありませんTEntity)。型消去にEntity<K>T

:エンティティ自体のEntityK

そして、もう一つの「内側」ジェネリック型を参照するための

ワン:したがって、次の2つのジェネリック医薬品を必要としますJavaは、宣言なしで実行時にパラメータタイプKを把握することができません。