現在、私はこのセットアップを持っています:
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) に変更AccountConstraint
しAccountConstraint<AccountBean>
ますが、型引数自体は使用されないため有効ではないと思いますAccountConstraint
。
2) 関係を定義し、 が関係にあるかどうかを確認する方法を用意しますR
。つまりManager
、を確認する必要があります。しかし、その場合、関係を定義できる必要もあります。とにかく、それが本当ならどうすればこれを実装できるでしょうか?<B, C>
R
R(B, C)
R<AccountBean, AccountConstraint>
R = Manager
よろしく。