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());