https://en.wikipedia.org/wiki/Type_erasure говорит
стирание типа относится к процессу загрузки, с помощью которого явные аннотации типа удаляются из программы перед ее выполнением ввремя выполнения. Операционная семантика, которая не требует, чтобы программы сопровождались типами, называется семантикой удаления типа , для сравнения с семантикой передачи типа . Возможность предоставления семантики стирания типа является своего рода принципом абстракции, гарантирующим, что выполнение программы во время выполнения не зависит от информации о типе. В контексте общего программирования противоположность стиранию типов называется reification .
- Являются ли итификация, и семантика передачи типов противоположными стиранию типов?
- Каковы отношения и различия между реализацией и семантикой передачи типов? Они имеют в виду одно и то же?
Лучшее, что я могу найти о них, это две следующие книги. Но я все еще не совсем уверен в своем вопросе.
О стирании типов и прохождении типов, Типы и языки программирования Пирса говорит:
23.7 Порядок стирания и оценки
Операционная семантика, данная Системе F на рисунке 23-1, является семантикой передачи типа : когда полиморфная функция встречает аргумент типа, типна самом деле подставляется в тело функции. Реализация ML системы F в главе 25 делает именно это. В более реалистичном интерпретаторе или компиляторе для языка программирования, основанного на System F, такое манипулирование типами во время выполнения может привести к значительным затратам. Более того, легко увидеть, что аннотации типов не играют никакой существенной роли во время выполнения, в том смысле, что не принимаются решения во время выполнения на основе типов: мы можем взять хорошо типизированную программу, переписать ее аннотации типов впроизвольным образом, и получите программу, которая ведет себя точно так же.
По этим причинам многие полиморфные языки вместо этого принимают семантику стирания типа , где после фазы проверки типов все типыудаляются, а полученные нетипизированные термины интерпретируются или компилируются в машинный код.
Об удалении типа по сравнению с реализацией, Прагматика языка программирования Скоттом говорит:
C # 2.0 смог использовать реализацию, основанную на подтверждении , а не стирании . Реабилитация создает новый конкретный тип каждый раз, когда генерик генерируется с различными аргументами. Повторные типы видны в библиотеке отражений (csNames.GetType().ToString()
возвращает «Арбитр 1 [System.Double]»), и вполне допустимо вызвать new T()
, если T
является параметром типа с конструктором с нулевым аргументом (aограничение на этот эффект не требуется). Более того, когда компилятор Java должен генерировать неявные приведения типов, чтобы удовлетворить требования виртуальной машины (которая ничего не знает об универсальных типах) и обеспечить безопасное взаимодействие с типом с унаследованным кодом (который может передавать параметр или возвращать результат неподходящего типа)компилятор C # может быть уверен, что такие проверки никогда не понадобятся, и поэтому может их не включать. Результат - более быстрый код.
Спасибо.