【问题标题】:Use Class<? extends Collection> as a method signature使用类<?扩展 Collection> 作为方法签名
【发布时间】: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&lt;Collection&gt;(不是Class&lt;? extends Collection&gt;)?
  • 为什么不传入相关类型的Supplier
  • 我确实在方法签名中写入了Class&lt;? extends Collection&gt;,但我正在使用的IDE (IntelliJ) 将方法标记为它在我的测试类中使用它时所期望的Class&lt;Collection&gt;。为什么会出现这种情况? @Sweeper
  • 我确实更改了方法签名以尝试@AndyTurner 建议的Supplier 选项。这一次,错误指出请求的类型必须是Supplier&lt;Class&lt;? extends Collection&gt;&gt;,但提供了Supplier&lt;Class&lt;List&gt;&gt;
  • 不,不是Supplier&lt;Class&lt;...&gt;&gt;Supplier&lt;C&gt;,其中C 是一个以Collection 为界的类型变量。

标签: java collections wildcard extends generic-type-parameters


【解决方案1】:

Class&lt;? extends Collection&gt; 的用法其实是正确的。我遇到的问题确实是指方法的返回类型,无法将Collection&lt;T&gt;转换为List&lt;T&gt;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-23
    • 2011-10-21
    • 2016-09-06
    • 2017-01-31
    • 2011-05-29
    相关资源
    最近更新 更多