在集合中使用UNSAFE

时间:2013-12-14 15:22:16

标签: java collections

我注意到在Java 7中,集合类(在我的例子中是ConcurrentLinkedQueue)使用UNSAFE类进行交换和查找操作。
偏移量似乎是根据编译时声明计算的:

itemOffset = UNSAFE.objectFieldOffset(local.getDeclaredField("item"));

如果我们在编译时没有确切的参数化类型,例如当我们尝试将一个苹果插入声明中具有Collection<? super Apple>的方法时,它将如何工作?

它是否使用'Apple'作为计算偏移的声明类?
非常感谢任何帮助,了解UNSAFE在这里计算偏移量的方式。

1 个答案:

答案 0 :(得分:3)

Jave不允许我们使用原始类型作为泛型的类型参数,只允许引用类型。引用类型存储为始终具有相同大小的引用,因此无论它们如何参数化,某些泛型类的对象的内部表示始终相同。

因此,精确类型的集合项无关紧要,因为item是一个始终具有相同大小的引用。