Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Java泛型的双通配符参数化(嵌套通配符)_Java_Generics - Fatal编程技术网

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

使用Java泛型的双通配符参数化(嵌套通配符),java,generics,Java,Generics,我正在使用一个来自第三方库()的方法,该库应该查找给定类型的子类型,如下所示 public <T> Set<Class<? extends T>> getSubTypesOf(final Class<T> type) { ... Class<?> type = ... Set<Class<?>> subTypes = reflections.getSubTypesOf(type); 公共集类型=。。。 设置类

我正在使用一个来自第三方库()的方法,该库应该查找给定类型的子类型,如下所示

public <T> Set<Class<? extends T>> getSubTypesOf(final Class<T> type) {
...
Class<?> type = ...
Set<Class<?>> subTypes = reflections.getSubTypesOf(type);
公共集类型=。。。
设置类型=。。。
Set subtype=reflections.getsubscriptsof(ht);

因此,它似乎是唯一可能解决不正确的
Set
而不是
Set的方法,因为
是通配符,当您插入
类时,该方法返回
集以下内容将有帮助:您的have
?为右侧的
Class
扩展T
(受T限制)(
getsubscriptsof
返回它),所以您也需要在左侧扩展它:

Class<? extends T> type;
Set<Class<? extends T>> subTypesOf = getSubTypesOf(type);
Class>subtype=reflections.getsubscriptsof(类型);

< /代码> 你必须考虑“?”意思是“未知”,而不是“任何”。
Set<Class<?>> subTypes = reflections.getSubTypesOf(type);

Set使用以下选项:

Set<? extends Class<?>> subTypes = reflections.getSubTypesOf(type);
在这里,
getSubsubsof
返回一个
Set>
。但是,通配符捕获帮助我们表达协方差,允许像
Set>
这样的类型。需要注意的是,我们不能向这样一个集合添加任何内容,除了
null
,因为我们不知道它的具体类型

相关职位:

类似职位:


这意味着他必须通过一个类型参数来扩展自己的方法-否则您不能编写
类,这意味着在左侧,您只能接收
。T表示从上到下的限制。方法返回
Set@Smutje
T
将是一个实际的类,例如
Set@AshotKarakhanyan我明白你的意思,你是说
?延伸?扩展T
将减少到
?以这种方式扩展T
。然而,这是最终的代码,不能用比
更具体的东西来参数化。我完全不知道
T
可以是什么,因为它可以是任何东西。@AshotKarakhanyan好的,无论如何,我不能更改
getSubscriptsof
方法的签名,因为它来自第三方库。因此,使左侧与其返回值保持一致是最初的问题。请参阅Paul Bellora的答案,其中他展示了如何形成左侧类型,该类型将编译为OK(但是逻辑对我来说仍然很模糊)。感谢您的参与和关注!不幸的是,我不知道
类型
参数的具体类,因为它以前是从另一个类的注释中读取的,并且允许是任何类型。然后你必须向调用反射调用的方法添加一个类型参数,你有一个
来调用反射方法。现在我得到了它(至少部分:))。看起来说“?”意味着“未知”,而不是“任何”,你准确地描述了正在发生的事情。即使我将
类类型
参数视为任何类,调用
GetSubsubsof
的结果也不是“任何类”,而是受
类型
的子类型约束的类,因此它不能像
那样。我希望有一些漂亮的方法来处理这种情况。这真的很有效,谢谢!坦率地说,我现在不明白
在哪里?扩展类
来自,因为它让我觉得我们开始处理扩展类
,而这根本不是我的代码的内容。好的,我们将更详细地研究您的参考文献列表:)@PavelS很乐意提供帮助。当用于表示泛型边界时,
extends
不一定意味着一个子类,而只是一个子类型。例如
。还请注意,在此上下文中,
将被视为自身的一个子类型,因此
设置>
Set<Class<?>> subTypes = reflections.getSubTypesOf(type);
Set<? extends Class<?>> subTypes = reflections.getSubTypesOf(type);
Class<Number> type = ...
Set<Class<?>> subTypes = reflections.getSubTypesOf(type);