使用泛型时复合模式的可伸缩性

时间:2018-04-12 13:31:29

标签: java generics composition

想象一下以下类型的对象层次结构:

Group
  Person
    Address

然后是一些类实现:

ImmutableGroup
  PeopleyPerson
  MonsterPerson
    PostalAddress
      getZip() :: String
    EmailAddress
      getDomain() :: String

我们希望允许此API的客户端以类型安全的方式使用这些类型。所以客户可能想要这样做:

group.personAt(0).getAddress().getDomain()

他们可以这样做,因为Group被定义为:

Group<? extends PeopleyPerson<EmailAddress>> group

这意味着必须将组定义为:

interface Group<A extends Address,P extends Person<A>>

我们必须让Group知道Address,即使它没有出现在“运行时”API中。

这对我来说很有气味。它意味着对类型层次结构的任何进一步添加都要求所有父项也在其通用声明中表示添加的类型。

有解决方法吗?

1 个答案:

答案 0 :(得分:1)

应该足够了
interface Group<P extends Person<?>>

然后使用组合层次结构中的具体类型定义实际的组实例:

Group<PeopleyPerson<EmailAddress>> group

这样,API的使用者将对所使用的类型具有类型安全性,同时维护层次结构中的每个接口(例如,组,人员,地址)与其直接子项之外的类型不可知。

查看此类实施的示例here