【发布时间】:2016-06-08 08:59:25
【问题描述】:
我尝试编写一个带有参数名称并可以返回给定对象的相应参数的类。目前,我的班级是这样的:
public class ParamValue<T> {
private String paramName;
@SuppressWarnings("unchecked")
public T getValue(Object obj) throws Exception {
Class<?> c = obj.getClass();
Field param = c.getDeclaredField(paramName);
boolean isAccessible = param.isAccessible();
param.setAccessible(true);
Object value = param.get(obj);
param.setAccessible(isAccessible);
return (T) value;
}
// get set ...
}
现在,假设我们有一个带有简单 Long 参数的对象:
public class ExampleClass {
private Long value;
// get set ...
}
我们可以这样做来取回长值:
ExampleClass ec = new ExampleClass();
ec.setValue(12L);
ParamValue<Long> pvString = new ParamValue<>();
pvString.setParamName("value");
// print 12
System.out.println(pvString.getValue(ec));
现在,例如,如果我将“ParamValue”声明为一个点,它仍然有效:
ExampleClass ec = new ExampleClass();
ec.setValue(12L);
ParamValue<Point> pvPoint = new ParamValue<>();
pvPoint.setParamName("value");
// print 12
System.out.println(pvPoint.getValue(ec));
但是,由于 Point 无法转换为 Long,我预计会出现一些异常,例如 ClassCastException。
我知道 java 编译器在编译时会进行一些类型擦除,但我认为编译器会自动尝试转换为 Point 并失败,以输出“pvPoint.getValue(ec)”
有人可以解释一下这是如何工作的吗?
谢谢
【问题讨论】:
-
你指的是哪个Point类?
-
java.awt.Point ,但我不确定这是否重要。
-
如果编译器知道强制转换何时有效,则无需强制转换。根据定义进行强制转换发生在运行时。
标签: java generics reflection