我注意到在Java 7中,集合类(在我的例子中是ConcurrentLinkedQueue)使用UNSAFE类进行交换和查找操作。
偏移量似乎是根据编译时声明计算的:
itemOffset = UNSAFE.objectFieldOffset(local.getDeclaredField("item"));
如果我们在编译时没有确切的参数化类型,例如当我们尝试将一个苹果插入声明中具有Collection<? super Apple>
的方法时,它将如何工作?
它是否使用'Apple'作为计算偏移的声明类?
非常感谢任何帮助,了解UNSAFE在这里计算偏移量的方式。
答案 0 :(得分:3)
Jave不允许我们使用原始类型作为泛型的类型参数,只允许引用类型。引用类型存储为始终具有相同大小的引用,因此无论它们如何参数化,某些泛型类的对象的内部表示始终相同。
因此,精确类型的集合项无关紧要,因为item
是一个始终具有相同大小的引用。