En informática , un sistema de tipos es nominal (también llamado nominativo o basado en nombres ) si la compatibilidad y equivalencia de los tipos de datos se determina mediante declaraciones explícitas y/o el nombre de los tipos. Los sistemas nominales se utilizan para determinar si los tipos son equivalentes, así como si un tipo es un subtipo de otro. Los sistemas de tipos nominales contrastan con los sistemas estructurales , donde las comparaciones se basan en la estructura de los tipos en cuestión y no requieren declaraciones explícitas.
La tipificación nominal significa que dos variables son compatibles en cuanto a tipos si y solo si sus declaraciones nombran el mismo tipo. Por ejemplo, en C , dos struct
tipos con nombres diferentes en la misma unidad de traducción nunca se consideran compatibles, incluso si tienen declaraciones de campo idénticas.
Sin embargo, C también permite una typedef
declaración que introduce un alias para un tipo existente. Estas son meramente sintácticas y no diferencian el tipo de su alias con el propósito de verificar el tipo. Esta característica, presente en muchos lenguajes, puede resultar en una pérdida de seguridad de tipos cuando (por ejemplo) el mismo tipo entero primitivo se usa de dos maneras semánticamente distintas. Haskell proporciona el alias sintáctico al estilo C en la forma de la type
declaración, así como la newtype
declaración que sí introduce un tipo nuevo, distinto, isomorfo a un tipo existente. [1]
De manera similar, la subtipificación nominal significa que un tipo es un subtipo de otro si y solo si se declara explícitamente que lo es en su definición. Los lenguajes con tipificación nominal suelen exigir que los subtipos declarados sean estructuralmente compatibles (aunque Eiffel permite declarar subtipos no compatibles). Sin embargo, los subtipos que son estructuralmente compatibles "por accidente", pero no se declaran como subtipos, no se consideran subtipos.
C++ , C# , Java , Kotlin , Objective-C , Delphi , Swift , Julia y Rust utilizan principalmente tipado nominal y subtipado nominal.
Algunos lenguajes con subtipos nominales, como Java y C#, permiten que las clases se declaren finales (o selladas en la terminología de C#), lo que indica que no se permite ningún otro subtipo.
La tipificación nominal es útil para evitar equivalencias de tipos accidentales, lo que permite una mayor seguridad de tipos que la tipificación estructural. El costo es una menor flexibilidad, ya que, por ejemplo, la tipificación nominal no permite crear nuevos supertipos sin modificar los subtipos existentes.