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根本就不看调用的时候传入什么类型的东西,只看方法定义?
你完全可以这样写:
只是前者看上去比较牛逼罢了,其实效果完全相同。