【发布时间】:2021-02-15 06:04:37
【问题描述】:
我正在尝试创建一个函数,该函数接收具有一个类型参数 T 的参数化类的实例,然后使用反射查看其封装类的字段,检查这些字段是否属于 T 类型,然后如果他们是的话,就会对他们进行强制转换并做一些事情。到目前为止,这是我所拥有的:
private <T> void someFunction(SomeClass<T> instance) throws IllegalAccessException {
for(Field field : this.getClass().getDeclaredFields()){
Object obj = field.get(this);
// TODO: get parameter T from instance and store it in a variable named 'myClass'
if(myClass.isInstance(obj)){
doSomething(instance, myClass.cast(obj))
}
}
}
据我了解,为了在运行时执行此操作,您需要声明一个 Class 类型的变量并将 T 的类存储在其中,以便您可以使用 isInstance() 和 cast() 函数,但我是不确定如何正确执行此操作。
【问题讨论】:
-
to do this at runtime you need to declare a variable of type Class and store the class of T in there so you can then use the isInstance() and cast() functions你需要澄清一下,因为这太模糊了。您有该声明的来源吗? -
T是一个类型参数。没有“T 级”。T的实际参数可能类似于? extends Comparable&CharSequence。没有Class对象可以代表这个。 -
@Holger 哦,这有道理,但是看看另一个post,在答案中我发现了这个代码sn-p:
ParameterizedType pt = (ParameterizedType)this.getClass().getGenericSuperclass(); clazz = (Class<?>)pt.getActualTypeArguments()[0];虽然当我尝试这样做时,我得到了错误java.lang.ClassCastException: sun.reflect.generics.reflectiveObjects.TypeVariableImpl cannot be cast to java.lang.Class。是否可以做类似的事情来从类型参数中获取单个类? -
Type在某些情况下可能是Class,但在其他情况下则不是。当你有一个class Sub<T> extends Super<T>形式的类时,那么getGenericSuperclass().getActualTypeArguments()[0]不能是Class,因为Super的类型参数是T由Sub声明的类型变量,而不是具体的类.由于someFunction是通用的,该函数的调用者将决定使用哪个类型的参数。SomeClass中的任何内容都无法告诉您someFunction的直接调用者做了什么。
标签: java generics java-8 casting instanceof