想象一下以下类型的对象层次结构:
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中。
这对我来说很有气味。它意味着对类型层次结构的任何进一步添加都要求所有父项也在其通用声明中表示添加的类型。
有解决方法吗?
答案 0 :(得分:1)
应该足够了
interface Group<P extends Person<?>>
然后使用组合层次结构中的具体类型定义实际的组实例:
Group<PeopleyPerson<EmailAddress>> group
这样,API的使用者将对所使用的类型具有类型安全性,同时维护层次结构中的每个接口(例如,组,人员,地址)与其直接子项之外的类型不可知。
查看此类实施的示例here