泛型类 泛型方法

新手上路,请多包涵

public <T> void k(T a,T b) {...}
为啥 a和b能传入2个不同类型 那它逆向推测<T>是什么类型?

阅读 2.1k
3 个回答

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的子类就行了

所有非基本类型都是Object。

a和b如果传入2个不同类型,那么推断T是a和b最具体的共同基类,如果ab完全没有共同基类,就是Object。

其实泛型T在字节码中都生成为Object,除非指定T extends xxx。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题