我正在使用第三方库(Reflections)中的一种方法,该方法应该查找给定类型的子类型,并且看起来像
public <T> Set<Class<? extends T>> getSubTypesOf(final Class<T> type) {
...
当呼叫者代码看起来像
Class<?> type = ...
Set<Class<?>> subTypes = reflections.getSubTypesOf(type);
我收到一个编译错误:“ cannot convert from Set<Class<? extends capture#19-of ?>> to Set<Class<?>>
”。以下解决了这种情况:
Class<?> type = ...
Set<?> subTypes = reflections.getSubTypesOf(ht);
所以看起来唯一可能的错误补救办法Set<Class<? extends ?>>
是Set<?>
但不是Set<Class<?>>
。为什么会这样呢?感谢您对此的任何解释。
请改用以下内容:
Set<? extends Class<?>> subTypes = reflections.getSubTypesOf(type);
问题是嵌套通配符不执行类型捕获。声明一个Set<Class<?>>
方法是“任何类型的一组类”,而返回的是一个Set<Class<? extends capture#19-of ?>>
,这意味着“从某个特定未知类型扩展的任何类型的一组类”。在这种情况下,“特定未知类型”是从的type参数派生的,该类型参数T
是从type
无限制的通配符捕获(?
in中Class<?>
)推断的。
例如,假装“特定未知类型”为Number
:
Class<Number> type = ...
Set<Class<?>> subTypes = reflections.getSubTypesOf(type);
在这里,getSubTypesOf
返回Set<Class<? extends Number>>
。该类型不可分配,Set<Class<?>>
因为泛型类型不是协变的。但是,通配符捕获可以帮助我们表达协方差,并允许类似的类型Set<? extends Class<?>>
。需要注意的是,除了null
这样的集合,我们什么都不能添加,因为我们不知道它的具体类型。
相关文章:
类似职位:
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句