Articulo de referencia

Cualquier tipo

En teoría de tipos e informática , los sistemas de tipos incluyen un tipo superior , universal o cualquier tipo (a menudo representado con el símbolo de flecha hacia abajo ( ⊤ )...

En teoría de tipos e informática , los sistemas de tipos incluyen un tipo superior , universal o cualquier tipo (a menudo representado con el símbolo de flecha hacia abajo ( )), que incluye todos los demás tipos como subtipos. El tipo superior también se denomina a veces tipo universal o supertipo universal , ya que todos los demás tipos del sistema de tipos en cuestión son subtipos del mismo. En lenguajes orientados a objetos , se suele llamar Objeto , puesto que representa todos los objetos posibles.

El tipo superior contrasta con el tipo inferior , o subtipo universal , del cual todos los demás tipos son supertipos. El tipo inferior es un tipo que no contiene ningún subtipo.

Soporte en lenguajes de programación

Varios lenguajes de programación tipados ofrecen soporte explícito para el tipo superior.

En los lenguajes de tipado estático , existen dos conceptos diferentes, que a menudo se confunden, al hablar del tipo superior.

  1. Una clase base universal u otro elemento en la parte superior de una jerarquía de clases en tiempo de ejecución (a menudo relevante en la programación orientada a objetos ) o jerarquía de tipos ; a menudo es posible crear objetos con este tipo (en tiempo de ejecución), o se puede encontrar cuando se examina la jerarquía de tipos programáticamente, en lenguajes que lo admiten.
  2. Un tipo estático ( en tiempo de compilación ) en el código cuyas variables pueden recibir cualquier valor (o un subconjunto del mismo, como el valor de cualquier puntero a objeto), similar a la tipificación dinámica.

El primer concepto suele implicar 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 (por ejemplo, void*en C , iden Objective-C , interface {}en Go ), tipos estáticos que las variables pueden aceptar cualquier valor de objeto, pero que no reflejan los tipos reales en tiempo de ejecución que un objeto puede tener en el sistema de tipos, por lo que no son tipos principales en el primer sentido.

En los lenguajes de tipado dinámico, el segundo concepto no existe (cualquier valor puede asignarse a cualquier variable), por lo que solo se aborda el primero (jerarquía de clases). Este artículo se centra en el primer concepto al hablar de los tipos principales, pero también menciona el segundo en los lenguajes donde resulta relevante.

Los siguientes lenguajes orientados a objetos no tienen una clase base universal:

  • C++ y Rust no tienen una clase universal como Object.
  • Objective-C . Es posible crear una nueva clase base sin especificar una clase padre para una clase, aunque esto es muy inusual. Objectse utiliza convencionalmente como la clase base en los entornos de ejecución originales de Objective-C. En las bibliotecas OpenStep y Cocoa Objective-C , es convencionalmente la clase base universal. El tipo superior para punteros a objetos es .NSObjectid
  • Swift . Es posible crear una nueva clase base sin especificar una clase padre para una clase. El protocolo Anypuede aceptar cualquier tipo.

Otros idiomas

Los lenguajes que no están orientados a objetos generalmente no tienen soporte para supertipos universales ni para polimorfismo de subtipos .

Aunque Haskell carece deliberadamente de subtipos, tiene varias 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 , es el parámetro más genérico ( no lo es, ya que implica el rasgo por defecto).<T:?Sized><T>Sized

std::any(en C++) y std::any::Any(en Rust) no son realmente tipos superiores en el sistema de tipos, sino más bien contenedores borrados de tipos, de los cuales se obtienen los datos a través de la conversión descendente (o refinamiento de tipos ).

std.variant.VariantEn D se comporta como un tipo cualquiera, pero en lugar de ser la raíz de un árbol de herencia, es una unión etiquetada de todos los tipos.

El tipo superior se utiliza como un tipo genérico , más en lenguajes sin polimorfismo paramétrico . Por ejemplo, antes de la introducción de los genéricos en Java en Java 5, las clases de colección en la biblioteca estándar de Java (excluyendo los arreglos de Java) contenían referencias de tipo java.lang.Object. De esta manera, cualquier tipo no intrínseco podía insertarse en una colección. El tipo superior también se usa a menudo para contener objetos de tipo desconocido. Java admite " parámetros de tipo comodín? ", representados por . Por ejemplo, List<?>denota una lista que puede contener cualquier tipo (pero no null ). Los comodines pueden estar acotados, y denotan una lista que puede contener cualquier tipo que herede de/sea una clase antecesora de (respectivamente) tipo (incluido él mismo). Sin embargo, los comodines no pueden tener simultáneamente límites superiores e inferiores.List<?extendsT>List<?superT>TT

El tipo superior también puede considerarse como el tipo implícito de los lenguajes no tipados estáticamente. Los lenguajes con tipado en tiempo de ejecución suelen ofrecer conversiones descendentes para permitir descubrir un tipo más específico para un objeto en tiempo de ejecución.

En C y C++ , el tipo de puntero voidvoid* ( ) puede aceptar cualquier puntero que no sea una función, aunque el tipo void no sea el tipo universal sino el tipo de unidad . En C++, la conversión descendente desde void*no se puede realizar de forma segura , ya que el entorno de ejecución del lenguaje detecta los fallos de conversión descendente.

En lenguajes con un sistema de tipado estructural , la estructura vacía sirve como tipo superior. Por ejemplo, los objetos en OCaml tienen tipado estructural; el tipo de objeto vacío (el tipo de objetos sin métodos), < >, es el tipo superior de los tipos de objeto. Cualquier objeto de OCaml puede convertirse explícitamente a este tipo, aunque el resultado no sería útil. 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 convertirse a un tipo más específico.

En Kotlin , el tipo superior es kotlin.Any?, una forma anulable de kotlin.Any(el tipo superior que no permite null). Aunque kotlin.Anyse asigna a java.lang.Objecten la JVM , Kotlin impone la anulabilidad mientras que Java no.

En lógica

La noción de top también se encuentra en el cálculo proposicional , vinculándose a una fórmula que es verdadera en toda interpretación posible. Tiene un significado similar en el cálculo de predicados . En lógica descriptiva , top se usa para referirse al conjunto de todos los conceptos. Esto es intuitivamente similar al uso del tipo top en 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).

Véase también

Notas

  1. System.Object
  2. Unificación de tipos/clases en Python
  3. Matilla, Hugo (27 de febrero de 2019). "Conceptos básicos de Kotlin: tipos. Any, Unit y Nothing" . Medium . Consultado el 16 de septiembre de 2019 .
  4. "Una visión general del lenguaje de programación Scala" (PDF) . 2006. Consultado el 7 de abril de 2014 .
  5. "Tipos — El lenguaje de programación Swift (Swift 5.3)" . docs.swift.org . Consultado el 2 de noviembre de 2020 .
  6. "Tipos · El lenguaje Julia" . Consultado el 15 de mayo de 2021 .
  7. "Cualquier tipo" . 2022. Consultado el 26 de octubre de 2022 .
  8. "Estándar ECMA-367. Eiffel: Análisis, diseño y lenguaje de programación" (PDF) . 2006. Archivado del original (PDF) el 10 de febrero de 2012. Consultado el 10 de marzo de 2016 .
  9. "std.variant - Lenguaje de programación D" . dlang.org . Consultado el 29 de octubre de 2022 .
  10. "Clase BasicObject - Documentación para Ruby 3.5" .
  11. "Los tipos principales 'any' y 'unknown' en TypeScript" .
  12. "El tipo desconocido en TypeScript" . 15 de mayo de 2019.

Referencias

  • c2.com: Tipo superior