【发布时间】:2022-01-18 14:09:33
【问题描述】:
在方法签名中,我需要一个从 Collection 扩展的任何类类型(List、Set 等)的参数,因此我可以返回它们中的任何一个。
为了达到这个目的,我确实使用了以下方法:
public Collection<T> method(Class<? extends Collection> collectionType) {
// Do something...
}
但是当我尝试像这样使用它时:
method(List.class);
出现以下错误:
Error: java: incompatible types: java.lang.Class<java.util.List> cannot be converted to java.lang.Class<java.util.Collection>
我确实在 Stackoverflow 中搜索了一个已经解决的答案,找到了这篇文章:Java - Class<? extends Collection>
但这并不能帮助我理解错误。我想我不理解通配符 (?) 的用法。
【问题讨论】:
-
无法复制。该方法实际上是否采用
Class<Collection>(不是Class<? extends Collection>)? -
为什么不传入相关类型的
Supplier? -
我确实在方法签名中写入了
Class<? extends Collection>,但我正在使用的IDE (IntelliJ) 将方法标记为它在我的测试类中使用它时所期望的Class<Collection>。为什么会出现这种情况? @Sweeper -
我确实更改了方法签名以尝试@AndyTurner 建议的
Supplier选项。这一次,错误指出请求的类型必须是Supplier<Class<? extends Collection>>,但提供了Supplier<Class<List>>。 -
不,不是
Supplier<Class<...>>,Supplier<C>,其中C是一个以Collection为界的类型变量。
标签: java collections wildcard extends generic-type-parameters