,任何通用类型信息在
我一直在尝试使用反射动态设置字段。当谈到泛型类时,有一个障碍。考虑这个代码:
Wrapper.java:
public class Wrapper<T> {
private T var;
public void setVar(T var) {
this.var = var;
}
public T getVar() {
return this.var;
}
}
Main.java:
import java.lang.reflect.Field;
public class Main {
public static void main(String[] args) {
try {
Wrapper<Integer> integer = new Wrapper<Integer>();
Field f = integer.getClass().getDeclaredField("var");
f.setAccessible(true);
f.set(integer, "test");
System.out.println("Assignable: " + f.getType().isAssignableFrom(String.class));
System.out.println("Var value: " + integer.getVar());
System.out.println("Int value: " + integer.getVar().intValue());
}
catch (Exception e) {
e.printStackTrace();
}
}
}
主要方法打印
Assignable: true
Var value: test
java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Integer
at Main.main(Main.java:15)
从文档集(java.lang.Object,java.lang.Oobject):
如果指定的对象参数为null,则该方法将抛出NullPointerException。如果指定的对象参数不是声明底层字段的类或接口的实例方法引发IllegalArgumentException。
下面的代码不应该抛出IllegalArgumentException吗?即使使用泛型变量类型,如何检查字段是否可以设置?
我想,由于类型擦除
f.set(integer, "test")
时刻都会被擦除