Ну, а почему бы вам не посмотреть, что делает ?Источник общедоступен.
Guice делает эти вещи на нескольких уровнях.Особо выделяются литералы типа .
. Ключевой момент здесь заключается в том, что в то время как типы скомпилированы с использованием стирания типов (поэтому существует только один класс для каждого типа), все еще существует несколько Type
объектов, которые знают используемые обобщения.Тем не менее, код оптимизируется независимо от этого (как он был скомпилирован для класса, а не для типа).
Посмотрите на API Java ParameterizedType
.
Таким образом, несмотря на то, что Generics Java реализован "стиранием типа" на уровне class , это не полностью соответствует уровню Type
.К сожалению, обработка типов намного сложнее, чем классов.Кроме того, это также означает, что Java не может оптимизировать обобщенные элементы так же, как это делает C ++, в частности, для примитивных типов.ArrayList<Integer>
по конструкции будет ArrayList<?>
, содержащим объекты, и не будет поддерживаться собственным массивом int[]
, когда это возможно.
Обратите внимание, что это, однако, довольно близко к отслеживанию этих вещей самостоятельно,Скажем, очень наивно (это не будет работать с вложенными обобщениями), вы можете просто расширить ArrayList<T>
с помощью класса, имеющего поле Class<T> contentClass
, тогда вы сможете найти эту информацию во время выполнения.(Однако здесь TypeLiteral может быть лучшим выбором вместо класса!) Кроме того, JRE фактически не будет гарантировать, что список остается согласованным.Точно так же, как вы могли бы преобразовать ArrayList<Integer>
в нетипизированный ArrayList
и добавить объект String
.