首页 / JAVA / java – 泛型和演员
java – 泛型和演员
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了java – 泛型和演员,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2204字,纯文字阅读大概需要4分钟。
内容图文
我尝试编写一个带有参数名称的类,并且可以返回给定对象的相应参数.目前,我的班级看起来像这样:
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”声明为Point,它仍然有效:
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方法接受任何Object作为参数,因此在编译时,无论您声明的参数化类型如何,都将接受任何类.
如果你想要类型安全,你可以将方法的参数声明为<?延伸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);
}
在这种情况下,无需对您的类进行参数化.您甚至可以将上述方法中的return语句修改为:
if (returnType.isInstance(value)) {
return returnType.cast(value);
} else {
// could be replaced with a return null
throw new ClassCastException("Exception message");
}
内容总结
以上是互联网集市为您收集整理的java – 泛型和演员全部内容,希望文章能够帮你解决java – 泛型和演员所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。