黑马程序员技术交流社区

标题: 奇怪的代理类类型转换问题 [打印本页]

作者: 长跑※终点    时间: 2014-8-11 00:47
标题: 奇怪的代理类类型转换问题
如果是下图的代码运行,则会报: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("麻烦了");


作者: fantacyleo    时间: 2014-8-11 01:03
因为newProxyInstance的返回类型就不是ArrayList,它只不过和ArrayList一样实现了Collection接口罢了。你从传给newProxyInstance的参数就可以看出,其实没有传ArrayList的Class对象。就好像猫和狗都实现了X接口,你说:请给我一个实现了X的对象,那么你只能保证返回的一定是X的一个实现类的对象,而不能说一定是猫或者狗
作者: dispensable    时间: 2014-8-11 01:49
:LnewProxyInstance 返回的是Collection类型的一个实例对象,虽然Collection是一个接口,但是其实跟学多态的时候差不多的,不能把父类的实例对象赋值给子类类型的引用变量,或者另一个角度来看:newProxyInstance 返回的是一个动物,但是你不能把这个动物强制转换成猫,因为这个动物有可能是狗
作者: 长跑※终点    时间: 2014-8-11 09:43
dispensable 发表于 2014-8-11 01:49
newProxyInstance 返回的是Collection类型的一个实例对象,虽然Collection是一个接口,但是其实跟学多态 ...

谢谢。我看eclipse里面,newProxyInstance的返回值是 Object对象,怎么可以转换成Collection,应该是上面那位所说的实现了Collection接口吧。你说的多态这个我知道,我是奇怪。为什么Object的可以转换成Collection,newProxyInstance里面的代码很多都是取ArrayList的,却不能转为ArrayList.




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2