推断类型是否反映在字节码中?

Are inferred types reflected in byte code?

我知道 Java 中的类型推断和类型擦除,但我不确定它们是如何工作的。例如说 List<Integer> list = List.of(1) 。由于 of(E... elements) 接受可变数量的某种类型的元素和 returns List<E>,我认为 E 被推断为整数。

我感到困惑的部分是,由于 E 已被推断为 Integer,因此在编译时类型擦除后 E 是否仍擦除为 Object -时间?类型擦除是如何工作的?如果推断类型不是“存储”/“结转”,类型推断的意义是什么?

是的,在编译时,泛型只创建一个特化,使用 Object,假设你有两个列表 List<? extends Object> list = List.of(1)List<? extends Object> strs = List.of("test"),在编译时两者都是 List<Object> ,对于第二个问题,类型擦除有利于减少代码占用空间,只有一个专业化,它减少了携带这些信息的内存成本,重要的是不要谈论反射滥用,如果我们携带这些信息,它将允许很多事情可能会使程序不合理。当然,擦除能够使 class 从非通用到通用兼容地发展,而不会破坏现有源或二进制 class 文件。