gpt4 book ai didi

java - 如何通过.class获取泛型类型?

转载 作者:太空宇宙 更新时间:2023-11-04 14:19:44 25 4
gpt4 key购买 nike

有问题的代码如下所示。

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
// ...
}

唯一的方法是使用原始类型,或者通过更改 registerClass klazz而不是Class<T> ,或通过类型转换 new GenericClassRegisterHandler()(RegisterHandler)new GenericClassRegisterHandler() 。由于这两个“修复”都利用原始类型,并且我不想使用它们(为什么要使用它们?我应该能够通过 Class<GenericClass<?>> 以某种方式获得 .class !),但到目前为止我没有看到其他解决方案。我是否遗漏了一些明显的东西,并且在没有具体化包装器等的情况下是可能的,还是根本不可能?

注:Wrapping a Class<?> type generics error是一个很好且有启发性的发现,但在这里不起作用。

注 2:虽然 Bloch 在 EJ 2nd 中讨论了类似的问题,但我无法找到针对这种情况的任何明确的解决方案。

顺便说一句,显而易见的(Class<GenericClass<?>>) GenericClass.class由于incompatible types: Class<GenericClass<?>> cannot be converted to Class<GenericClass>而无法工作

http://ideone.com/Fr4yng 上的测试片段

最佳答案

这个任务可以通过小的修改来解决:

static class RegisterHandler<T> {
public <E extends T> void register( Class<E> klazz ) { // <== Note additional generics customization.
// do something
}
}

同意,泛型有点棘手 =)

关于java - 如何通过.class获取泛型类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27336283/

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