Подтвердить что ты не робот

Почему следующие типы могут повторно использоваться и не поддаваться проверке в java?

В вычислениях овеществление стало означать явное представление типа, то есть информации типа времени выполнения.

уроки оракула,

Подтверждаемый тип - это тип, информация о типе которого полностью доступна во время выполнения. Сюда входят примитивы, не общие типы, типы сырья, и вызовы несвязанных подстановочных знаков.

Невосстанавливаемые типы - это типы, в которых информация удалена компиляция по типу стирания - вызовы общих типов, которые не определены как неограниченные подстановочные знаки.

Тип можно отменить, если он является одним из следующих:

  • Примитивный тип (например, int)//понял
  • Непараметрированный класс или тип интерфейса (например, Number, String или Runnable)//почему
  • Параметрированный тип, в котором все аргументы типа являются неограниченными подстановочными знаками (такими как List<?>, ArrayList<?> или Map<?, ?>)//почему
  • Необработанный тип (например, List, ArrayList или Map)//почему
  • Массив, тип компонента которого можно повторно идентифицировать (например, int[], Number[], List<?>[], List[] или int[][])//почему

Тип не может быть повторно идентифицирован, если он является одним из следующих:

  1. Переменная типа (например, T)//почему
  2. Параметрированный тип с фактическими параметрами (например, List<Number>, ArrayList<String> или Map<String, Integer>)//почему
  3. Параметрированный тип с привязкой (например, List<? extends Number> или Comparable<? super String>)//почему

Почему 2,3,4,5 можно повторно использовать и 6,7,8 в качестве невосстанавливаемых?

4b9b3361

Ответ 1

Sun/Oracle говорит, что причина в том, что необходимо (проверка типов во время компиляции достаточно), размер кода (избегать раздувания кода, подобного STL) и производительность (избегайте проверки типов во время выполнения, которая уже была выполнена во время компиляции):

Стирание типов гарантирует, что для параметризованных типов не создаются новые классы; следовательно, генерики не несут затрат времени выполнения.

Короче говоря, 1-5 являются пригодными для повторного использования, поскольку они просто остаются теми же типами, которые указаны в коде, поэтому информация о типах не будет потеряна/стерта, но 6-8 потеряют информацию о типах во время компиляции (материал между <>), поэтому можно не будут доступны во время выполнения.

Ответ 2

Понимать смысл этих двух терминов.

Reifiable означает, чей тип полностью доступен во время выполнения, означает, что java-компилятор не нуждается в каком-либо процессе стирания типа.

Неподтверждаемый означает, что java-компилятор требует типа стирания, потому что тип не полностью доступен.

Тип можно отменить, если он является одним из следующих:

1. Простейший тип (например, int):

Считаете ли вы, что когда вы пишете или используете какой-либо int в качестве ссылки, считаете ли вы, что компилятору нужен какой-либо процесс идентификации для типа int? нет, потому что int is int.... тот же для всех примитивных типов

2. Непараметрированный класс или тип интерфейса (например, Number, String или Runnable)

тот же ответ, что я сказал в предыдущем ответе, что компилятор не нуждается в стирании типа для Number, String или Runnable.

3. Параметрированный тип, в котором все аргументы типа являются неограниченными подстановочными знаками (такими как List <? > , ArrayList <? > Или Map <?,? > )

Все неограниченные подстановочные знаки принимаются в качестве допустимого типа, потому что это уже упоминается в определении reifiable type, теперь разработчик API может объяснить, почему они считают его повторно идентифицируемым.

4. Необработанный тип (например, List, ArrayList или Map)::

тот же ответ, что и первый вопрос

5. Массив, тип компонента которого можно повторно идентифицировать (например, int [], Number [], List <? > [], List [] или int [] [])::

тот же ответ, что и первый вопрос

Тип не может быть повторно идентифицирован, если он является одним из следующих:

6. Тип переменной (например, T):

Поскольку java не может идентифицировать тип T, компилятор требует стирания типа для идентификации типа.

7. Параметрированный тип с фактическими параметрами (такими как List <Number> , ArrayList <String> или Map < String, Integer > ):

Здесь весь тип - это общий тип, при компиляторе во время выполнения см. Список как список... так что согласно определению Non-refiable все эти коллекции считаются невосстанавливаемыми.

8. Параметрированный тип с привязкой (например, List <? extends Number > или Comparable <? super String > ).

тот же ответ, что и предыдущий

Ответ 3

вы можете задать google тот же вопрос:

reifiable type

Когда вы используете обобщения, большую часть времени, тип времени компиляции информация теряется. Во время работы часто вся программа знает о ссылка - это ссылка на какой-то объект. Если все информация типа также известна во время выполнения, тип называется reifiable. Возможно, некоторые дженерики будут переработаны так, что все типы могут быть повторно идентифицированы.

Ответ 4

Подтверждаемый тип - это тип, информация о типе которого полностью доступна во время выполнения. Сюда входят примитивы, не общие типы, типы сырья, и вызовы несвязанных подстановочных знаков.

Невосстанавливаемые типы - это типы, в которых информация удалена компиляция по типу стирания - вызовы общих типов, которые не определены как неограниченные подстановочные знаки. Невосстанавливаемый тип не имеет вся его информация доступна во время выполнения. Примеры невосстанавливаемых Типы: List <String> и List <Number> ; JVM не может сказать разница между этими типами во время выполнения. Как показано в разделе "Ограничения на В целом, существуют определенные ситуации, когда невосстанавливаемые типы не может использоваться: в случае выражения, например, или как элемент в массиве.

Ссылка

Ответ 5

Java изначально реализовала отражение в версии 1.1.

В версии 5.0 были введены общие классы.

При введении дженериков было решено, что для обратной совместимости информация об родовом типе будет стерта во время выполнения. Этот разрешенный код, который был написан для предикатов, работал с кодом на основе генериков без изменений.

Например, a List[Integer32] будет переведен компилятором на Integer32[]. Все проверки типов будут выполняться во время компиляции, и если что-то было пропущено, это приведет к ошибке выполнения.

Эта деталь реализации означала, что дженерики не были подтверждены (в VM нет конкретной реализации их), и поэтому всякий раз, когда кто-то попытается отразить общий тип, возвращаемая информация будет иметь тип базового типа. Еще одна причина, по которой это было бы выгодно, заключается в том, что никакие реализации для типов reified не должны были быть выбраны VM всякий раз, когда они использовались (например, в С#, когда вы используете общий тип, фактическая реализация которого создается VM во время выполнения, наряду с метаданными отражения, таким образом, сбой производительности каждый раз, когда требуется создать новый тип).

Ответ 6

Просто образованная догадка, но я подозреваю, что ключ к пониманию этого заключается в том, чтобы признать, что, хотя Java является строго типизированным языком и проверяет ссылки на типы как часть процесса компиляции, во многих случаях информация о типе фактически не нужна для выполнения логика. В этом случае сгенерированный байт-код может знать, что он работает с экземпляром объекта, но не знает тип. Это особенно важно, учитывая, что языки, которые не используют сильную типизацию, могут быть созданы как java-байт-код. Поэтому, если тип объекта был удален, экземпляр будет невосстанавливаться.

Ответ 7

Я не совсем уверен, что понимаю ваш вопрос, но вы можете ссылаться на типы объектов, а не на примитивные типы. Этот вопрос тем более важен, что примитивные типы, такие как int или double, не могут использоваться как общие типы - следовательно, их классы упаковки, такие как Integer.

// This won't work
ArrayList<int> list = new ArrayList<int>();
// But this will
ArrayList<Integer> list = new ArrayList<Integer>();

Подводя итог, я бы сказал, что все объекты - и только объекты - являются повторно доступными. (И поэтому можно использовать в качестве экземпляра типичных типов)