关于Java泛型推断,希望大牛不吝赐教
请教大牛一个问题,希望不吝赐教,关于泛型的推断:当某个类型变量在整个参数列表中的所有参数和返回值中的多处被应用了,如果调用方法时这多处的实际应用类型对应到了不同的类型,且没有使用返回值,这时候取多个参数中的最大交集类型
例:下面语句实际对应的类型就是Number了,编译没问题,只是运行时出问题。
public static void test(T[] array, T b) {
for (int i = 0; i < array.length; i++){
array[i] = b;
}
}
调用:test(new Integer[3],new Float(1));
既然推断出来T是Number了,为什么还会出现问题了?
如果你对这篇文章有疑问,欢迎到本站 社区 发帖提问或使用手Q扫描下方二维码加群参与讨论,获取更多帮助。

评论(12)




这个问题和泛型没什么关系,你把new Float(1)换成"test"字符串是一样的,没有推断Number这回事,这个情况里编译器根本不在意你传的是什么类型,T会被擦除,所以不会有编译错误
最终的类型还是由你传的参数决定,array就是一个Integer[]指针,b就是一个Float指针,Float放进Integer数组显然会有运行时错误
补充一句:T的作用可以看作给编译器静态检查用的,如果你定义
public static <T extends Number> void test(T[] array, T b)
那么就传入字符串就会报错,但是在编译结束后的字节码里是没有T的信息的,具体参考类型擦除机制

发布评论
需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。