0

現在、私はこのセットアップを持っています:

public abstract class Manager<B extends Bean, C extends AbstractConstraint> { 
    public final int insert(B b);

    public final boolean update(B b);

    public final boolean delete(B b);

    public final B get(C... c);

    public final List<B> search(C... c);

    public final List<B> getAll();
}

public interface Bean { }

public abstract class AbstractConstraint { }

具体的に使用される:

public class AccountManager extends Manager<AccountBean, AccountConstraint> { }

public class AccountBean implements Bean { }

public class AccountConstraint extends AbstractConstraint { }

いくつかのコメント:

  • Bean可能な限り低いエンティティです。これは、データベース内のテーブルからの行の直接のインスタンスです。
  • ここで私が間違っていない限り、 の具体的な実装は の具体的な実装AbstractConstraintを実装/拡張するべきではありません。Bean

を介してManager渡すことができるのは、 の具体的なバージョンだけであると確信できます<Bean, AbstractConstraint>

ただし、現在、これを定義することは完全に有効です。

public class BogusManager extends Manager<AccountBean, CharacterConstraint> { }

これはまったく意味がありません。これが許可されないようにコードを制限するにはどうすればよいですか?

次の 2 つのオプションがあると思います。

1) に変更AccountConstraintAccountConstraint<AccountBean>ますが、型引数自体は使用されないため有効ではないと思いますAccountConstraint

2) 関係を定義し、 が関係にあるかどうかを確認する方法を用意しますR。つまりManager、を確認する必要があります。しかし、その場合、関係を定義できる必要もあります。とにかく、それが本当ならどうすればこれを実装できるでしょうか?<B, C>RR(B, C)R<AccountBean, AccountConstraint>R = Manager

よろしく。

4

3 に答える 3

1

Your first option is legal, you do not need to use type variable.

For the second option, you need to pass class instances of bean and constraint to manager constructor which will check if this is legal pair. As far as I know there is no way to implement such check in source only, i.e. add declarative constraint to source code.

于 2013-06-30T20:30:16.037 に答える