gpt4 book ai didi

java - 添加通配符时,方法不适用于参数

转载 作者:行者123 更新时间:2023-12-02 12:56:22 25 4
gpt4 key购买 nike

我有以下两个类(class):

class ProblematicConverter implements Converter<List<?>> {};
class NonProblematicConverter implements Converter<List> {};

Utils类的方法:

<T> void addConverter(Class<? extends T> cls, Converter<T> converter);

现在,第一个函数调用正常,但第二个函数调用会产生错误:

addConverter(List.class, new ProblematicConverter());
addConverter(List.class, new NonProblematicConverter());

错误说:

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

我不明白为什么会这样。

最佳答案

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

  • TaddConverter推断为 List<?> .
  • cls 中的有界通配符要求其类型参数为 TT 的子类型,但是原始类型 ListList<?> 的父类(super class)型(specified here)。
  • 因此,Class<List>cls 的推断类型不兼容这是 Class<? extends List<?>> .

因此,例如,以下两个声明中的任何一个都将与问题中的调用一起编译:

<T> void m(Class<T> cls, Converter<? extends T> converter) {}
<T> void m(Class<? super T> cls, Converter<T> converter) {}

这当然对你没有帮助,但它说明了 List 之间的关系。和List<?> .

您可能还会看到these两个answers我的其中讨论了类似的情况。

无论如何,根据您的评论,您正在尝试消除原始类型并且无法更改 addConverter 的声明,合适的方法是使用 Class<List> 中未经检查的强制转换至Class<List<?>> :

@SuppressWarnings("unchecked")
static final Class<List<?>> WILD_LIST =
(Class<List<?>>) (Class<? super List<?>>) List.class;

这将让您调用例如:

addConverter(WILD_LIST, new ProblematicConverter());

但是,我想指出,未经检查的转换并不是一个通用解决方案。这是针对转换这一特定问题的解决方案,例如一个Class<GenericType>Class<GenericType<?>> 。这样做是安全的,因为GenericType<?>是比原始类型限制更严格的类型 GenericType因为Class它可以使用其类型参数执行的操作非常有限。

如果您可以更改 addConverter 的声明,我想我会推荐使用像 Guava TypeToken 这样的东西而不是Class ,因为这样你就不会遇到此类问题。

关于java - 添加通配符时,方法不适用于参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44415414/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com