有问题的代码如下所示。
class GenericClass<T> {
// ...
}
class RegisterHandler<T> {
// ...
public void register( Class<T> klazz ) {
// do something
}
// ...
}
class GenericClassRegisterHandler extends RegisterHandler<GenericClass<?>> {
// ...
}
public static void registerAll() {
// ...
new GenericClassRegisterHandler().register( GenericClass.class );
// error: actual argument Class<GenericClass> cannot be converted to Class<GenericClass<?>> by method invocation conversion
// ...
}
唯一的方法是使用原始类型,方法是更改register
为Class klazz
而不是Class<T>
或强制转换new GenericClassRegisterHandler()
为(RegisterHandler)new GenericClassRegisterHandler()
。由于这两个“修复”都利用了原始类型,并且我不想使用它们(为什么?我应该能够以Class<GenericClass<?>>
某种方式获得.class
!),但是到目前为止,我还没有其他解决方案。我是否遗漏了一些明显的东西,并且可能不修改包装等而已,还是根本不可能?
注意:包装Class <?>类型泛型错误是一个不错的启发性发现,但在这里不起作用。
注意2:在EJ 2nd中的Bloch讨论类似问题时,我无法找到针对此确切情况的任何明确解决方案。
顺便说一句,(Class<GenericClass<?>>) GenericClass.class
由于以下原因显然不起作用incompatible types: Class<GenericClass<?>> cannot be converted to Class<GenericClass>
我的解决方案是进行双重转换。
new GenericClassRegisterHandler()
.register( (Class<GenericClass<?>>) (Class<?>) GenericClass.class );
虽然它可能不是最优雅的,但是在某些情况下(例如,您是生产者,而消费者的界面是固定的,或者您不想出于任何其他原因进行更改),它是最好的-因为这是唯一的可能。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句