一道反射和泛型的面试题
2017-02-26 10:20
239 查看
面试题目大概如下:
现在有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); 我们是无法获取到类型参数的。迷雾已解开。。。
现在有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); 我们是无法获取到类型参数的。迷雾已解开。。。
相关文章推荐
- 一道关于反射的面试题(通过反射修改父类私有属性)
- 一道面试题考验Linux命令
- 单例模式、泛型和反射的概念
- 看一道IBM面试题 - 要注意沟通中的隐含假定
- 记一道关于链表逆序的面试题
- 一道简单的面试题:字符串转换成整数(修正版)
- 一道c++面试题的思考与学习(类内存布局)
- 高新_枚举、反射、泛型、类加载器、动态代理
- cocos2d-x 一道简单面试题,触摸事件的重新分发
- 一道打印M型的面试题
- 一道小小面试题的细节分析
- java 反射获得泛型的实例
- 一道面试题
- 每日一道面试题(前端)
- 利用泛型与反射更新实体(ADO.NET Entity Framework)
- java 泛型使用和反射
- 一道腾讯面试题的思考:到底谁会赢?
- DataReader反射泛型对象
- 一道趣味面试题(c)
- 一道碰面率很低的Intel面试题