0

作成した抽象スーパークラスを拡張するオブジェクトのデータベース操作を実行する「CRUD マネージャー」クラスを作成しようとしています。抽象クラスはかなり単純です。

public abstract class IndexedEntity() {

    protected Long id;

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        if(id == null)
        this.id = id;
        else throw new UnsupportedOperationException
        ("The ID cannot be changed once it was set.");
    }

}

これで、この IndexedEntity を拡張する 2 つのクラスができました。これらのクラスは、私のビジネス エンティティを表していCarますCustomerLease

ビジネス エンティティごとに CRUD マネージャーを作成する代わりに、共通のスーパークラスをサポートする共通の CRUD クラスを作成してみようと考えました。

構築時に型パラメーターを受け取り、その型パラメーターが特定の型 (IndexedEntity から継承する型) に限定されるジェネリック クラスを作成するにはどうすればよいですか?

何かのようなもの:

public interface ICrudManager<IndexedEntity> {

    public void add(IndexedEntity e);

    public IndexedEntity get(long id);

    public void update(IndexedEntity e);

    public void delete(IndexedEntity e);

    public List<IndexedEntity> getAll();

}

Javaで可能ですか?または、このアイデアに何か問題がありますか / それは受け入れられる設計上の選択だと思いますか?

(多くの動作を一般化するのは難しすぎるかもしれないので、明日は最初にそれを放棄するかもしれませんが、現時点ではどのようにそれを行うことができるのか興味があります.

4

3 に答える 3

4

境界型パラメーターを使用する

public interface ICrudManager<T extends IndexedEntity> {

    public void add(T e);

    public IndexedEntity get(long id);

    public void update(T e);

    public void delete(T e);

    public List<T> getAll();

}

次のようなオブジェクトを作成できますICrudManager<Car> carManager = new CrudManagerImpl<Car>();

于 2013-05-07T13:52:42.327 に答える
1
 public interface MyInterface<T extends MyClass>
于 2013-05-07T13:53:00.920 に答える
1

public <T> interface ICrudManager <T exdents IndexedEntity>一致しないクラスを挿入しようとすると、コンパイラ エラーが発生するインターフェイス行を変更することができます。

システムをより動的にしたい場合は、実行中に型をテストする初期化子を持つ抽象クラスを使用できます。

 public abstract <T> class {
      {
         if(!T instanceof IndexedEntity)
            throw new TypeException()
         }
   }
于 2013-05-07T14:22:05.527 に答える