面试题目大概如下:
现在有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); 我们是无法获取到类型参数的。迷雾已解开。。。