在编译时获取Class <MyGeneric <MyType >>

时间:2019-07-23 16:48:00

标签: java

有什么方法可以将Class<MyGenericClass<MyGenericType>>存储到Java中的变量中?我不需要在运行时解决它,只需要使用我已经知道的MyGenericType在编译时获取该类。我曾尝试搜索此内容,但在运行时使用类型解析的结果却泛滥成灾。

例如,要获得Class,我就要做

Class<SomeClass> myClass = SomeClass.class

我想要类似

Class<MyGenericClass<MyGenericType>> myGenericClass = MyGenericClass<MyGenericType>.class

但是不能编译。

我需要Class的实例,因为我正在使用需要Class作为参数的第三方库的方法,例如:

public static <T> void doThingWithClassType(Class<T> clazz) {
...
}

3 个答案:

答案 0 :(得分:1)

这当然是黑客,但是如果您确实需要此,则可以执行以下操作:

@SuppressWarnings("unchecked")
Class<MyGenericClass<MyGenericType>> myClass = (Class<MyGenericClass<MyGenericType>>)(Class<?>)MyGenericClass.class;

这有效,因为实际上没有MyGenericClass<MyGenericType>类。由于泛型擦除,只剩下MyGenericClass,因此将其强制转换为所需的实际类应该是安全的。

答案 1 :(得分:0)

在编译时如何将其存储到变量中?您只能在运行时存储它。

泛型在运行时不存在。

答案 2 :(得分:0)

Spring用TypeReference解决了这个问题,Jackson也有自己的实现TypeReference