public <T> void k(T a,T b) {...}
为啥 a和b能传入2个不同类型 那它逆向推测<T>是什么类型?
a和b如果传入2个不同类型,那么推断T是a和b最具体的共同基类,如果ab完全没有共同基类,就是Object。
其实泛型T在字节码中都生成为Object,除非指定T extends xxx。
15 回答8.2k 阅读
8 回答6k 阅读
1 回答4.1k 阅读✓ 已解决
3 回答2.2k 阅读✓ 已解决
2 回答3.2k 阅读
2 回答3.9k 阅读
1 回答2.2k 阅读✓ 已解决
public <T> void k(T a,T b) 这样定义的方法用javap得到的字节码文件中是这样显示的
public static <T extends java.lang.Object> void k(T, T)
而我使用的参数是
k(1,"ni");
k("ni",15f);
再看这部分的字节码
0: iconst_1
1: invokestatic #5 // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
4: ldc #6 // String ni
6: invokestatic #7 // Method k:(Ljava/lang/Object;Ljava/lang/Object;)V
9: ldc #6 // String ni
11: ldc #8 // float 15.0f
13: invokestatic #9 // Method java/lang/Float.valueOf:(F)Ljava/lang/Float;
16: invokestatic #7 // Method k:(Ljava/lang/Object;Ljava/lang/Object;)V
可以很明显的看出:
Java中所有的类都继承了Object,但是int、char、long等基本类型除外
从字节码可以看出,编辑器在处理这部分的时候是把基本类型转变成使用Integer、Float等封装类,也就是使用了Object的子类,所以传入的参数不同类型无所谓,只要是Object的子类就行了