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



我一直在尝试使用反射动态设置字段。当谈到泛型类时,有一个障碍。考虑这个代码:

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")时刻都会被擦除

相关内容

  • 没有找到相关文章

最新更新