En teoría de tipos , la cuantificación limitada (también polimorfismo limitado o genericidad restringida ) se refiere a cuantificadores universales o existenciales que están restringidos ("limitados") para abarcar solo los subtipos de un tipo particular. La cuantificación limitada es una interacción del polimorfismo paramétrico con la subtipificación . La cuantificación acotada se ha estudiado tradicionalmente en el entorno funcional de System F <:, pero está disponible en lenguajes modernos orientados a objetos que admiten polimorfismo paramétrico ( genéricos ), como Java , C# y Scala .
El propósito de la cuantificación acotada es permitir que las funciones polimórficas dependan de algún comportamiento específico de los objetos en lugar de la herencia de tipos . Asume un modelo basado en registros para clases de objetos, donde cada miembro de la clase es un elemento de registro y todos los miembros de la clase son funciones nombradas. Los atributos de los objetos se representan como funciones que no toman argumentos y devuelven un objeto. El comportamiento específico es entonces el nombre de alguna función junto con los tipos de argumentos y el tipo de retorno. La cuantificación acotada considera todos los objetos con dicha función. Un ejemplo sería una min
función polimórfica que considera todos los objetos comparables entre sí. [ cita necesaria ]
La cuantificación limitada por F o cuantificación limitada recursivamente , introducida en 1989, permite una tipificación más precisa de funciones que se aplican en tipos recursivos. Un tipo recursivo es aquel que incluye una función que lo utiliza como tipo para algún argumento o su valor de retorno. [1]
Este tipo de restricción de tipo se puede expresar en Java con una interfaz genérica. El siguiente ejemplo demuestra cómo describir tipos que se pueden comparar entre sí y utilizarlos como información de escritura en funciones polimórficas . La Test.min
función utiliza una cuantificación limitada simple y no garantiza que los objetos sean mutuamente comparables, a diferencia de la Test.fMin
función que utiliza una cuantificación limitada por F.
En notación matemática, los tipos de las dos funciones son
dónde
interfaz Comparable < T > { int comparar con ( T otro ); }clase pública Entero implementa Comparable <Entero> { @Override public int compareTo ( Entero otro ) { // ... } } clase pública String implementa Comparable < String > { @Override public int compareTo ( String other ) { // ... } }prueba de clase pública { pública estática vacía principal ( cadena [] args ) { cadena final a = min ( "gato" , "perro" ); Entero final b = min ( 10 , 3 ); final Comparable c = min ( "gato" , 3 ); // Lanza ClassCastException en tiempo de ejecución final String str = fMin ( "gato" , "perro" ); Entero final i = fMin ( 10 , 3 ); // Objeto final o = fMin("gato", 3); // No compila } public static < S extends Comparable > S min ( S a , S b ) { if ( a . compareTo ( b ) <= 0 ) { return a ; } más { return b ; } } public static < T extiende Comparable < T >> T fMin ( T a , T b ) { if ( a . compareTo ( b ) <= 0 ) { return a ; } más { return b ; } } }