gpt4 book ai didi

java - 使用 Java 泛型的双重通配符参数化(嵌套通配符)

转载 作者:搜寻专家 更新时间:2023-10-31 08:19:51 24 4
gpt4 key购买 nike

我正在使用来自第三方库 ( 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);

问题是嵌套的通配符不执行type capture .声明 Set<Class<?>>表示“一组任何类型”,而返回的是 Set<Class<? extends capture#19-of ?>> ,这意味着“从一些特定的未知类型扩展的任何类型的一组类”。在这种情况下,“特定未知类型”派生自 T 的类型参数,这是从 type 推断出来的成为无界通配符捕获(? 中的 Class<?>)。

例如,假设“特定未知类型”是Number :

Class<Number> type = ...
Set<Class<?>> subTypes = reflections.getSubTypesOf(type);

在这里,getSubTypesOf返回 Set<Class<? extends Number>> .该类型不可分配给Set<Class<?>>因为generic types aren't covariant .但是,通配符捕获可以帮助我们表达协变性,允许像 Set<? extends Class<?>> 这样的类型.需要注意的是,我们只能添加 null。对于这样的集合,因为我们不知道它的具体类型。

相关帖子:

类似的帖子:

关于java - 使用 Java 泛型的双重通配符参数化(嵌套通配符),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21779752/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com