通配符捕获规则Puzzler

时间:2016-10-29 06:59:38

标签: java generics

我正在对一个包含多个泛型类的框架进行一些更改,其中两个关键类是自我类型Holder<H extends Holder<H, T>, T>,另一个是HolderFactory<H extends Holder<H, T>, T>,你猜它会接收{{1}制作<T>。我遇到了一个我无法理解的问题。

我需要合作两种静态方法。一个基本上是:

<H>

另一个基本上是:

public static <T> HolderFactory<?, T> makeSpecialHolderFactory(Class<T> clazz);

我省略了许多细节需要这种层次结构,但上面的细节足以重现错误。以下行不编译:

public static <H extends Holder<H, T>, T> void process(HolderFactory<H, T> factory);

错误基本上是:

  • 方法static <T> void puzzler(Class<T> clazz) { process(makeSpecialHolderFactory(clazz)); } 不适用于参数process(HolderFactory<H,T>)
  • 类型不匹配:无法从(HolderFactory<?,T>)转换为HolderFactory<capture#1-of ?,T>

但这是麻痹,因为如果我在方法调用中明确指定HolderFactory<H,T>,或做其他任何事情,那么一切都很好!

<T>

问题: 为什么编译器无法识别process(UtilityClass.<T>makeSpecialHolderFactory(clazz)); // Compiles fine 满足capture#1的类型范围时必须按照类的定义Holder?为什么只有在方法调用中没有明确指定HolderFactory时才会抱怨这一点,这应该没有区别,因为<T>可以从参数中完全推断出来?

为了完整起见,这是一个干净,可编译的例子:

<T>

我正在使用jre1.8.0_11。

0 个答案:

没有答案