>想象一下以下类型的对象层次结构:
Group
Person
Address
然后是一些类实现:
ImmutableGroup
PeopleyPerson
MonsterPerson
PostalAddress
getZip() :: String
EmailAddress
getDomain() :: String
我们希望允许此 API 的客户端以类型安全的方式使用这些类型。因此,客户可能希望执行以下操作:
group.personAt(0).getAddress().getDomain()
他们可以做到这一点,因为组被定义为:
Group<? extends PeopleyPerson<EmailAddress>> group
这意味着组必须定义为:
interface Group<A extends Address,P extends Person<A>>
我们必须让 Group 知道地址,即使它没有出现在其"运行时"API 中。
这对我来说很臭。这意味着对类型层次结构的任何进一步添加都要求所有父级也在其泛型声明中表示添加的类型。
有没有办法解决这个问题?
应该足够了
interface Group<P extends Person<?>>
然后使用组合层次结构中的具体类型定义实际的组实例:
Group<PeopleyPerson<EmailAddress>> group
这样,API 的使用者将对所使用的类型具有类型安全性,同时保持层次结构中的每个接口(例如组、人员、地址(与其直接子级以外的类型无关。
在此处查看此类实现的示例