En lógica matemática y ciencias de la computación , algunas teorías de tipos y sistemas de tipos incluyen un tipo superior que se denota comúnmente con top o el símbolo ⊤. El tipo superior a veces también se denomina tipo universal o supertipo universal , ya que todos los demás tipos en el sistema de tipos de interés son subtipos de este y, en la mayoría de los casos, contiene todos los objetos posibles del sistema de tipos. Está en contraste con el tipo inferior , o el subtipo universal , del que todos los demás tipos son supertipos y, a menudo, el tipo no contiene ningún miembro.
Varios lenguajes de programación tipados proporcionan soporte explícito para el tipo superior.
En los lenguajes tipados estáticamente , hay dos conceptos diferentes, a menudo confusos, cuando se habla del tipo superior.
El primer concepto a menudo implica el segundo, es decir, si existe una clase base universal, entonces una variable que puede apuntar a un objeto de esta clase también puede apuntar a un objeto de cualquier clase. Sin embargo, varios lenguajes tienen tipos en el segundo sentido mencionado anteriormente (por ejemplo, void *
en C++ , id
en Objective-C , interface {}
en Go ), tipos estáticos cuyas variables pueden aceptar cualquier valor de objeto, pero que no reflejan los tipos de tiempo de ejecución reales que un objeto puede tener en el sistema de tipos, por lo que no son tipos superiores en el primer sentido.
En los lenguajes de tipado dinámico, el segundo concepto no existe (de todas formas, se puede asignar cualquier valor a cualquier variable), por lo que solo se analiza el primero (la jerarquía de clases). Este artículo intenta ceñirse al primer concepto cuando se analizan los tipos principales, pero también se menciona el segundo concepto en los lenguajes en los que es importante.
Los siguientes lenguajes orientados a objetos no tienen una clase base universal:
std::any
.Object
se utiliza convencionalmente como la clase base en los entornos de ejecución originales de Objective-C. En las bibliotecas Objective-C OpenStep y Cocoa , es convencionalmente la clase base universal. El tipo superior para punteros a objetos es .NSObject
id
Any
puede aceptar cualquier tipo.Los lenguajes que no están orientados a objetos generalmente no tienen supertipos universales ni soporte para polimorfismo de subtipos .
Si bien Haskell carece deliberadamente de subtipos, tiene otras formas de polimorfismo, incluido el polimorfismo paramétrico . El parámetro de clase de tipo más genérico es un parámetro sin restricciones a
(sin una restricción de clase de tipo ). En Rust , <T: ?Sized>
es el parámetro más genérico ( <T>
no lo es, ya que implica el Sized
rasgo por defecto).
El tipo top se utiliza como un tipo genérico , más aún en lenguajes sin polimorfismo paramétrico . Por ejemplo, antes de introducir los genéricos en Java 5 , las clases de colección en la biblioteca de Java (excluyendo las matrices de Java) contenían referencias de tipo Object
. De esta manera, cualquier tipo no intrínseco podía insertarse en una colección. El tipo top también se utiliza a menudo para contener objetos de tipo desconocido.
El tipo superior también puede considerarse como el tipo implícito de los lenguajes con tipado no estático. Los lenguajes con tipado en tiempo de ejecución suelen ofrecer conversión descendente (o refinamiento de tipo ) para permitir descubrir un tipo más específico para un objeto en tiempo de ejecución. En C++, la conversión descendente void *
no se puede realizar de forma segura , ya que las conversiones descendentes fallidas son detectadas por el tiempo de ejecución del lenguaje.
En lenguajes con un sistema de tipos estructurales , la estructura vacía sirve como tipo superior. Por ejemplo, los objetos en OCaml están tipados estructuralmente; el tipo de objeto vacío (el tipo de objetos sin métodos), < >
, es el tipo superior de los tipos de objetos. Cualquier objeto OCaml puede ser convertido explícitamente a este tipo, aunque el resultado no sería de ninguna utilidad. Go también utiliza tipado estructural; y todos los tipos implementan la interfaz vacía: interface {}
, que no tiene métodos, pero aún puede ser convertido a un tipo más específico.
La noción de top también se encuentra en el cálculo proposicional , que corresponde a una fórmula que es verdadera en cada interpretación posible. Tiene un significado similar en el cálculo de predicados . En la lógica descriptiva , top se utiliza para referirse al conjunto de todos los conceptos. Esto es intuitivamente similar al uso del tipo top en los lenguajes de programación. Por ejemplo, en el lenguaje de ontología web (OWL), que admite varias lógicas descriptivas, top corresponde a la clase owl:Thing
, donde todas las clases son subclases de owl:Thing
. (el tipo bottom o conjunto vacío corresponde a owl:Nothing
).