A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 长跑※终点 中级黑马   /  2014-8-11 00:47  /  1811 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

如果是下图的代码运行,则会报:java.lang.ClassCastException: com.sun.proxy.$Proxy0 cannot be cast to java.util.ArrayList,但是换成注释行的,就可以通过。我想写的代理类是想代理ArralList的,。里面的参数都是和ArrayList相关的,但是最后返回的类型却不能是ArrayList,而是Collection?哪位知道原因,麻烦告诉我下,谢谢。
ArrayListcl = (ArrayList)Proxy.newProxyInstance(
//          Collection cl = (Collection)Proxy.newProxyInstance(
                                ArrayList.class.getClassLoader(),
                                ArrayList.class.getInterfaces(),
                                new InvocationHandler(){
                                        ArrayList al =  new ArrayList();
                                        @Override
                                        public Object invoke(Object proxy, Method method,
                                        Object[] args) throws Throwable {
                                               long begintime = System.currentTimeMillis();                       
                                                  Object ob = method.invoke(al, args);       
                                                long endtime = System.currentTimeMillis();
                                                System.out.println("运行的时间是:"+ String.valueOf(endtime - begintime));
                                                return ob;
                                        }});
                cl.add("谢谢");
                cl.add("麻烦了");

4 个回复

倒序浏览
因为newProxyInstance的返回类型就不是ArrayList,它只不过和ArrayList一样实现了Collection接口罢了。你从传给newProxyInstance的参数就可以看出,其实没有传ArrayList的Class对象。就好像猫和狗都实现了X接口,你说:请给我一个实现了X的对象,那么你只能保证返回的一定是X的一个实现类的对象,而不能说一定是猫或者狗

点评

谢谢  发表于 2014-8-11 09:36
回复 使用道具 举报
:LnewProxyInstance 返回的是Collection类型的一个实例对象,虽然Collection是一个接口,但是其实跟学多态的时候差不多的,不能把父类的实例对象赋值给子类类型的引用变量,或者另一个角度来看:newProxyInstance 返回的是一个动物,但是你不能把这个动物强制转换成猫,因为这个动物有可能是狗
回复 使用道具 举报
dispensable 发表于 2014-8-11 01:49
newProxyInstance 返回的是Collection类型的一个实例对象,虽然Collection是一个接口,但是其实跟学多态 ...

谢谢。我看eclipse里面,newProxyInstance的返回值是 Object对象,怎么可以转换成Collection,应该是上面那位所说的实现了Collection接口吧。你说的多态这个我知道,我是奇怪。为什么Object的可以转换成Collection,newProxyInstance里面的代码很多都是取ArrayList的,却不能转为ArrayList.
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马