最近,由于我将开始一个很大程度上依赖于这些机制和允许访问它们的公共反射API的项目,因此我已经阅读了很多有关Java泛型的文章。但据我了解,这些有点矛盾:
请注意,通配符只能有一个界限。 in既不能同时具有上限和下限,也不能具有多个上限或下限。诸如“?超长扩展数”或“?可比较和可克隆的扩展”的构造是非法的。
({http://www.angelikalanger.com/GenericsFAQ/FAQSections/TypeArguments.html#FAQ102;部分通配符边界)
因此,通配符始终只有一个界限(如果忽略每个下限通配符都附带的上限“对象”)。但是,如果您查看相应的反射API类WildcardType
,似乎这不是全部事实:
为什么API仅提供函数getLowerBounds()
和getLowerBounds()
,为什么它们返回数组?是否有可能返回长度至少为2的数组?
答案 0 :(得分:1)
我当前可用的资源(1.8.0_172)包含以下“内部”注释:
// one or many? Up to language spec; currently only one, but this API
// allows for generalization.
因此,似乎该API是为将来可能会出现多个界限而设计的。
编辑:
Here's a link to the 1.8.0_181 sources,表明此评论仍然存在。 (Here's the same link for OpenJDK 10.0.2)
为什么即使不需要这种概括?假设您稍后将更改api,并且所有现有代码都需要从Type
更改为Type[]
,那么您将需要添加新方法,从而很难解释为什么有两种方法。