Java 创建X类型的泛型字段并通过反射将其值设置为(不相关的)Y类型不会导致IllegalArgumentException

Java 创建X类型的泛型字段并通过反射将其值设置为(不相关的)Y类型不会导致IllegalArgumentException,java,generics,reflection,Java,Generics,Reflection,我一直在使用反射动态设置字段。 对于泛型类,有一个障碍。 考虑这个代码: Wrapper.java: 从文件中: 如果指定的对象参数为null,则该方法将抛出 NullPointerException。如果指定的对象参数不是 声明基础字段的类或接口的实例 方法引发IllegalArgumentException 下面的代码不应该抛出IllegalArgumentException吗? 即使使用泛型变量类型,如何检查字段是否可以设置?我想,在f.set(integer,“test”)的时候,任何

我一直在使用反射动态设置字段。 对于泛型类,有一个障碍。 考虑这个代码:

Wrapper.java

从文件中:

如果指定的对象参数为null,则该方法将抛出 NullPointerException。如果指定的对象参数不是 声明基础字段的类或接口的实例 方法引发IllegalArgumentException

下面的代码不应该抛出IllegalArgumentException吗?
即使使用泛型变量类型,如何检查字段是否可以设置?

我想,在
f.set(integer,“test”)
的时候,任何泛型类型信息都会被删除,因为我知道字段的类型是对象,因为类型删除,但是,我如何检查是否可以设置该字段,并且以后不会导致强制转换异常?
public class Wrapper<T> {
    private T var;

    public void setVar(T var) {
        this.var = var;
    }

    public T getVar() {
        return this.var;
    }
}
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)