Java 方法不适用于添加通配符时的参数

Java 方法不适用于添加通配符时的参数,java,generics,compiler-errors,Java,Generics,Compiler Errors,我有以下两门课: class ProblematicConverter implements Converter<List<?>> {}; class NonProblematicConverter implements Converter<List> {}; 错误是: Utils类型中的方法addConverter(Class,Converter)不适用于参数(Class,ProblematicConverter) 我不明白为什么会这样。根据您的评论,我认

我有以下两门课:

class ProblematicConverter implements Converter<List<?>> {};
class NonProblematicConverter implements Converter<List> {};
错误是:

Utils类型中的方法addConverter(Class,Converter)不适用于参数(Class,ProblematicConverter)


我不明白为什么会这样。

根据您的评论,我认为在这里正确的做法可能是对
List.class
使用未经检查的强制转换,但首先,问题中的代码未编译的原因大致是:

  • addConverter
    T
    被推断为
    List
  • cls
    中的有界通配符要求其类型参数为
    T
    T
    的子类型,但原始类型
    List
    List
    的超类型
  • 因此,
    Class
    cls
    的推断类型不兼容,即
    Class>
因此,例如,以下两个声明中的任何一个都将与问题中的调用一起编译:

<T> void m(Class<T> cls, Converter<? extends T> converter) {}
<T> void m(Class<? super T> cls, Converter<T> converter) {}
这将允许您拨打电话,例如:

addConverter(WILD_LIST, new ProblematicConverter());

然而,我想指出,未经检查的铸造并不是一个普遍的解决方案。它解决了将
转换为
列表
不是
列表
的子类型的具体问题。(实际上是另一种方式)你在这里想干什么?在我看来,你不可能按原样工作。你需要使用番石榴
TypeToken
之类的东西,否则就真的放松了
addConverter
List
是一个and吗?是,除非你确切知道自己在做什么,否则你应该避免使用这两种方法中的任何一种。(如果可以,请选择
)@Radiodef函数addConverter由第三方库提供,我无法更改它。我必须实现实现转换器的类。当我使用无问题的实现时,一切都很好,但我得到了关于原始列表类型的编译器警告。所以我开始更正代码中的警告。小的更正列表。getClass()返回Class类型的变量
<T> void m(Class<T> cls, Converter<? extends T> converter) {}
<T> void m(Class<? super T> cls, Converter<T> converter) {}
@SuppressWarnings("unchecked")
static final Class<List<?>> WILD_LIST =
    (Class<List<?>>) (Class<? super List<?>>) List.class;
addConverter(WILD_LIST, new ProblematicConverter());