推断类型是否反映在字节码中?
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 文件。
我知道 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 文件。