Система номинального типа
Типовые системы |
---|
Общие понятия |
Основные категории |
Второстепенные категории |
В информатике система типов является номинальной (также называемой номинативной или основанной на имени ), если совместимость и эквивалентность типов данных определяются явными объявлениями и/или именами типов. Номинальные системы используются для определения эквивалентности типов, а также для определения того, является ли тип подтипом другого. Системы номинальных типов контрастируют со структурными системами , где сравнения основаны на структуре рассматриваемых типов и не требуют явных объявлений.
Номинальный тип [ править ]
Номинальная типизация означает, что две переменные совместимы по типу тогда и только тогда, когда их объявления называют один и тот же тип. Например, в C два struct
типы с разными именами в одной и той же единице перевода никогда не считаются совместимыми, даже если они имеют идентичные объявления полей.
Однако C также позволяет typedef
объявление, которое вводит псевдоним для существующего типа. Они являются просто синтаксическими и не отличают тип от его псевдонима с целью проверки типа. Эта функция, присутствующая во многих языках, может привести к потере безопасности типов, когда (например) один и тот же примитивный целочисленный тип используется двумя семантически разными способами. Haskell предоставляет синтаксический псевдоним в стиле C в форме type
декларация, а также newtype
объявление, которое вводит новый, отдельный тип, изоморфный существующему типу. [1]
Номинальный подтип [ править ]
Подобным же образом номинальное подтипирование означает, что один тип является подтипом другого тогда и только тогда, когда это явно заявлено в его определении. Номинально типизированные языки обычно требуют, чтобы объявленные подтипы были структурно совместимыми (хотя Eiffel позволяет объявлять несовместимые подтипы). Однако подтипы, структурно совместимые «случайно», но не объявленные как подтипы, не считаются подтипами.
C++ , C# , Java , Kotlin , Objective-C , Delphi , Swift , Julia и Rust — все они в основном используют как номинальную типизацию, так и номинальную подтипизацию.
Некоторые языки с номинальным подтипированием, такие как Java и C#, позволяют объявлять классы окончательными (или запечатывать их в терминологии C#), что указывает на то, что дальнейшее подтипирование не допускается.
Сравнение [ править ]
Номинальная типизация полезна для предотвращения случайной эквивалентности типов, что обеспечивает лучшую типобезопасность, чем структурная типизация. Цена — снижение гибкости, поскольку, например, номинальная типизация не позволяет создавать новые супертипы без изменения существующих подтипов.
См. также [ править ]
Ссылки [ править ]
- ^ «Отчет Haskell 2010: Объявления и привязки: определяемые пользователем типы данных» . Архивировано из оригинала 4 января 2017 г. Проверено 2 июня 2015 г.
Источники [ править ]
- Пирс, Бенджамин К. (2002). «§19.3 Системы номинального и структурного типа». Типы и языки программирования . МТИ Пресс . стр. 253–. ISBN 0-262-16209-1 .