作者热门文章
- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我尝试编写一个带有参数名称并可以返回给定对象的相应参数的类。目前,我的类(class)是这样的:
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 ...
}
我们可以这样做来取回 long 值:
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)”的输出
谁能解释一下这是如何工作的?
谢谢
最佳答案
ClassCastException 是一个RuntimeException,这意味着它只会在运行时抛出,而不会在编译时抛出。自贵引用Object value = param.get(obj);
是 Object 类型,您的类型转换应该被允许,因为所有类都扩展了 Object。您的 getValue 方法接受任何对象作为参数,因此在编译时,将接受任何类,无论您声明的参数化类型如何。
如果你想要类型安全,你可以将方法的参数声明为<? extends T>
然后只允许 T 和扩展它的类进行方法调用。
你也可以这样修改方法:
public <T> T getValue(Class<T> returnType, 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 returnType.cast(value);
}
在这种情况下,无需参数化您的类。您甚至可以将上述方法的返回语句修改为如下所示:
if (returnType.isInstance(value)) {
return returnType.cast(value);
} else {
// could be replaced with a return null
throw new ClassCastException("Exception message");
}
关于java - 泛型和强制转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37697848/
我是一名优秀的程序员,十分优秀!