我正在对一个包含多个泛型类的框架进行一些更改,其中两个关键类是自我类型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。