一道反射和泛型的面试题

              面试题目大概如下:

                            现在有Class A 有三个成员 a,b,c.及其get,set方法。。。。

                            再有一泛型类 Class Test<T>  里面有一方法public T buildClass(Map map);

                            map传入的参数是class A 成员的实例数据{a=>1,b=>2,c=>3}

                            问能否通过 buildClass方法进行实例话A,即A=new Test<A>().buildClass(map);

 

             一开始我完全没有思路,心想,buildClass完全没提供类的信息给我,我怎么去实例化A类.

            后来面试官见我茫然,提供下思路:泛型是在编译的时定就确定类型,反射的调用是在运行时。

   并提供可以先找到buildClass的返回类型再实例化。当我高兴的顺着这个思路下去的时候,面试官

   来了句,实际并不可行。。然后就略过了这面试题了。。

          

           回到家,对这个理论和实际冲突的现象,百思不得其解。。肯定哪个环节出现了问题。然后动手自己分析。

    一开始我先否定了结论,buildClass是可以实现的。经过我百度,用T extends abc (abc是抽象类),都无法实现.

          然后在一次的调试中   System.out.println(this.getClass().getDeclaredMethods()[1]);

          出现结果是:public java.lang.Object ddddd.Test.buildClass(java.util.Map)

          因此有个大胆的猜想:泛型是在编译的时定就确定类型,这句话中的类型,起了疑心,这个确定的类型并不是运行时

   new Test<abc>().buildClass(new HashMap());的abc类型,而是Test<T>,T所能确定的第一个父类,例Test<T extend  abc>

         T就在编译时会被编译成Test<abc>,如果 Test<T>,则是Test<Object>

        

        带着这个问题去用javap -verbose 反编译下Class文件. 

       

 

        再看看 T extend abc

      

   

     

        所以结论:public T buildClass(Map map); 我们是无法获取到类型参数的。迷雾已解开。。。

  

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值