03 June 2011

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根本就不看调用的时候传入什么类型的东西,只看方法定义?

你完全可以这样写:

1
2
3
4
private static Object test(Object a) {
    Person<Object> person = new Person<Object>(a);
    return person.getName();
}

只是前者看上去比较牛逼罢了,其实效果完全相同。



blog comments powered by Disqus