En teoría de tipos , la cuantificación acotada (también polimorfismo acotado o genericidad restringida ) se refiere a cuantificadores universales o existenciales que están restringidos ("acotados") para abarcar solo los subtipos de un tipo particular. La cuantificación acotada 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 orientados a objetos modernos que admiten polimorfismo paramétrico ( genéricos ) como Java , C# y Scala .
El propósito de la cuantificación limitada es permitir que las funciones polimórficas dependan de algún comportamiento específico de los objetos en lugar de la herencia de tipos . Supone un modelo basado en registros para las clases de objetos, donde cada miembro de la clase es un elemento de registro y todos los miembros de la clase son funciones con nombre. Los atributos de los objetos se representan como funciones que no toman argumentos y devuelven un objeto. El comportamiento específico es entonces un nombre de función junto con los tipos de los argumentos y el tipo de retorno. La cuantificación limitada considera todos los objetos con dicha función. Un ejemplo sería una min
función polimórfica que considera todos los objetos que son comparables entre sí. [ cita requerida ]
La cuantificación acotada por F o cuantificación acotada recursivamente , introducida en 1989, permite una tipificación más precisa de funciones que se aplican a 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 utilizar esto como información de tipificación en funciones polimórficas . La Test.min
función utiliza cuantificación acotada simple y no garantiza que los objetos sean comparables entre sí, a diferencia de la Test.fMin
función que utiliza cuantificación acotada F.
En notación matemática, los tipos de las dos funciones son
dónde
Interfaz Comparable < T > { int compararCon ( T otro ); }La clase pública Integer implementa Comparable < Integer > { @Override public int compareTo ( Entero otro ) { // ... } } La clase pública String implementa Comparable < String > { @Override public int compareTo ( String otro ) { // ... } }public class Test { public static void main ( String [] args ) { final String a = min ( "gato" , "perro" ); final Integer b = min ( 10 , 3 ); final Comparable c = min ( "gato" , 3 ); // Lanza ClassCastException en tiempo de ejecución final String str = fMin ( "gato" , "perro" ); final Integer 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 ; } else { return b ; } } public static < T extends Comparable < T >> T fMin ( T a , T b ) { if ( a . compareTo ( b ) <= 0 ) { return a ; } de lo contrario { devolver b ; } } }