2013-12-14 3 views
1

Я заметил, что в Java 7 классы коллекции (ConcurrentLinkedQueue в моем случае) используют класс UNSAFE для операций свопинга и поиска.
Смещение кажется, рассчитывается по времени компиляции декларации:Использование UNSAFE в коллекциях

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

Как это будет работать в случае, когда мы не имеем точного параметризованную типа во время компиляции, например, при попытке вставить яблоко в к метод, содержащий Collection<? super Apple> в декларации.

Использует ли это «Apple» как объявленный класс для вычисления смещения?
Поблагодарите любую помощь в понимании того, как UNSAFE работает для расчета смещений здесь.

ответ

3

Jave не позволяет использовать примитивные типы в качестве параметров типа дженериков, допускаются только ссылочные типы. Типы ссылок хранятся в виде ссылок, которые всегда имеют одинаковый размер, поэтому внутреннее представление объектов определенного общего класса всегда одно и то же, независимо от того, как они параметризуются.

Поэтому точный тип предметов коллекции не имеет значения, потому что item - это ссылка, которая всегда имеет тот же размер.

Смежные вопросы