Java的范型一直让我头疼,也一直没仔细研究,总之感觉不好用。这两天折腾了一下,把范型方法整明白了。
一个简单的例子:
| 1 2 3 4 | private static <T> T test(T a) { Person<T> person = new Person<T>(a); return person.getName(); } | 
调用的时候这样:
| 1 | test(1); | 
是不是认为编译器编译的时候会自动将T转换成Integer?我们来看看javap的结果:
| 1 | invokestatic #22; //Method test:(Ljava/lang/Object;)Ljava/lang/Object; | 
看到什么了?没有Integer,只有Object!
如果这样设计test():
| 1 2 3 4 | private static <T extends Number> T test(T a) { Person<T> person = new Person<T>(a); return person.getName(); } | 
结果就是:
| 1 | invokestatic #23; //Method test:(Ljava/lang/Number;)Ljava/lang/Number; | 
所以是不是可以得出结论,javac根本就不看调用的时候传入什么类型的东西,只看方法定义?
你完全可以这样写:
只是前者看上去比较牛逼罢了,其实效果完全相同。
