黑马程序员技术交流社区
标题:
关于代理类类型转换的问题
[打印本页]
作者:
屈_zi
时间:
2014-5-20 15:03
标题:
关于代理类类型转换的问题
昨天在编写ArrayList代理类的时候被一个问题搞得很头疼,下面的代码是获得一个对象的获取方法运行时间的代理类
static Object getRuntimeProxy(Object obj){
Object proxy = (Object)Proxy.newProxyInstance(
obj.getClass().getClassLoader(),//获取对象的类加载器
obj.getClass().getInterfaces(), //获取对象类型的接口列表
new getRuntime(obj));//使用getRuntime代理功能
return proxy;
}
复制代码
对于这段代码,类型转换是安全的:
List<Integer> proxy = (List<Integer>) getRuntimeProxy(new ArrayList());
复制代码
但是对于下面这种类型转换明显不安全的,Java却是必须等到运行期的时候才能发觉错误:
List<Integer> proxy = (List<Integer>) getRuntimeProxy(new String());
复制代码
而对于下面这种看起来十分安全的类型转换,却是失败的,而且也是要等到运行期的时候才能发觉错误:
List<Integer> proxy = (ArrayList<Integer>) getRuntimeProxy(new ArrayList());
复制代码
代理类是通过接口类型获得代理类的,因此被代理类必须是接口类型中的1种,且被代理类不能包含接口外的方法(
这句话对吗?
)。这样的话ArrayList()的代理类不能转换成ArrayList(),而可以转换为List类型就是容易理解的。
但是代理类的类型转换错误似乎都要等到运行期时才能发觉,这点对于编程不是很有利,产生这个问题是
我的代码有问题,还是Java中代理类的一个缺陷
?
对于ArrayList代理类不能转换成ArrayList类,以及类似的代理类只能转换成接口类型,Java似乎还有优化的空间,这点是我的学习未深入,理解不足,或者没有学习到解决方案,还是确实存在这样的问题?
作者:
屈_zi
时间:
2014-5-21 11:25
没有人回答么
作者:
lvc
时间:
2014-5-21 19:06
来看看,学习
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2