gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:04:59 24 4
gpt4 key购买 nike

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

包装器.java:

public class Wrapper<T> {
private T var;

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

public T getVar() {
return this.var;
}
}

主.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)

来自文档 set(java.lang.Object, java.lang.Object) :

If the specified object argument is null, the method throws a NullPointerException. If the specified object argument is not an instance of the class or interface declaring the underlying field, the method throws an IllegalArgumentException.

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

最佳答案

我想,由于 Type Erasure,所有通用类型信息在 f.set(integer, "test") 时都被删除了

关于java - 创建类型 X 的通用字段并通过反射将其值设置为(不相关的)类型 Y 不会导致 IllegalArgumentException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23188458/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com