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> { }

这根本没有意义,我该如何限制代码以使其不再被允许?

我认为我有两个选择:

1)更改AccountConstraintAccountConstraint<AccountBean>,但我不认为它是有效的,因为类型参数AccountConstraint本身不会被使用。

2)有一种方法来定义一个关系R并让Manager检查是否<B, C>有关系R,换句话说,你需要检查R(B, C)。但是你还需要能够定义一个关系R<AccountBean, AccountConstraint>,这意味着R = Manager,但我不认为这可能是真的。无论如何,如果这是真的,我将如何实现这一点?

问候。

4

3 回答 3

1

您的第一个选项是合法的,您不需要使用类型变量。

对于第二个选项,您需要将bean和的类实例传递constraint给管理器构造函数,它将检查这是否是合法的对。据我所知,没有办法仅在源代码中实现这种检查,即向源代码添加声明性约束。

于 2013-06-30T20:30:16.037 回答
1

像这样的东西应该满足选项 2 的编译时版本:

interface Witness< B, C > {}

public final class AccountConstraintsForAccountsOnly implements Witness< AccountBean, AccountConstraint > {}
public final class CharacterConstraintsForCharactersOnly implements Witness< CharacterBean, CharacterConstraint > {}

public abstract class Manager< B extends Bean, C extends AbstractConstraint, W extends Witness< B, C > { ... }
于 2013-06-30T20:41:24.217 回答
0

对于选项 1

 //add a Type    
abstract class AbstractConstraint<T>{}
//Type is tied to your Concrete bean
abstract class Manager<B extends Bean, C extends AbstractConstraint<B> >
{
.
.
.
}

在实现时 Constraint,说明它是什么类型Constraint,只需传递BeanType

前任。

 class BogusBean implements Bean { }
 class BogusConstraint extends AbstractConstraint<BogusBean> { }
 class BogusManager extends Manager<BogusBean, BogusConstraint> {}
于 2013-06-30T20:41:40.830 回答