设计类型安全API时的混凝土与有界参数化类型

时间:2008-11-21 08:43:35

标签: java generics

我想听听各位你们在设计API时如何决定何时应该使用具体的参数化类型与有界参数化类型,尤其是。 (我最关心)定义一个类/接口。

例如,

public interface Event<S>{
  void setSource(S s);
}

public interface UserEvent extends EVent<User> // OR: UserEvent<S extends User> extends Event<S>
  // It will therefore be void setSource(User s);
}

使用具体参数的问题是,当使用setSource()到新接口时,我无法获得这个编译时的好处,例如,

public interface AdminUserEvent extends UserEvent{
  void setSource(AdminUser s); // WHERE: AdminUser extends User. This is a method overloading, we also have a void setSource(User s) inherited from UserEvent.
}

我可以解决的问题是在调用User时对AdminUserEvent.setSource()对象进行类型检查。

您在设计API时是否曾提出过这个问题?当出现这种情况时,您将采取哪些做法或规则?感谢。

YC

2 个答案:

答案 0 :(得分:1)

我认为您评论的UserEvent<S extends User>方法是正确的 - 然后您可以声明AdminUserEvent extends UserEvent<AdminUser>。这就是你所需要的吗?

答案 1 :(得分:0)

如果我理解正确,这本身与泛型无关,而是与并行层次结构有关。 B extends ABHandler extends AHandlerAHandler.handle(A),但BHandler.handle(B)

是的,我相信这可以通过使用泛型来实现类型安全。也就是说,如果我正确理解你的问题。