所以我们有一个像这样的通用方法,它是依赖注入初始化的一部分:
public static <TS, TI extends TS> void registerTransient(
Class<TS> serviceClass, Class<TI> implementationClass)
{
//
}
在某些时候,我们发现了一个类可能不一定存在的情况。它是一个实现类,我们将注入多个关闭(因此服务类与实现类相同。)自然你会这样写:
Class<?> clazz = Class.forName("com.acme.components.MyPersonalImplementation");
registerTransient(clazz, clazz);
IDEA 对此没有任何问题,但 javac 抱怨:
error: method registerTransient in class TestTrash cannot be applied to given types;
required: Class<TS>,Class<TI>
found: Class<CAP#1>,Class<CAP#2>
reason: inferred type does not conform to declared bound(s)
inferred: CAP#2
bound(s): CAP#1
where TS,TI are type-variables:
TS extends Object declared in method <TS,TI>registerTransient(Class<TS>,Class<TI>)
TI extends TS declared in method <TS,TI>registerTransient(Class<TS>,Class<TI>)
where CAP#1,CAP#2 are fresh type-variables:
CAP#1 extends Object from capture of ?
CAP#2 extends Object from capture of ?
是什么赋予了?该方法要求第二个参数是第一个参数的子类。不管?
碰巧是什么类,对于两个参数来说,它都是同一个类对象,而且我认为,一个类总是可以从自身分配的。这几乎就像 javac 不必要地发明了第二个通配符类型来用于第二个参数,然后说“哦,亲爱的,你这里有两个通配符,所以我不知道一个是否可以从另一个分配。”