В теории типов ограниченная квантификация (также ограниченный полиморфизм или ограниченная генеративность ) относится к универсальным или экзистенциальным квантификаторам , которые ограничены («ограничены») диапазоном только по подтипам определенного типа. Ограниченная квантификация представляет собой взаимодействие параметрического полиморфизма с подтипированием . Ограниченная квантификация традиционно изучалась в функциональной настройке System F <: , но доступна в современных объектно-ориентированных языках, поддерживающих параметрический полиморфизм ( генерики ), таких как Java , C# и Scala .
Цель ограниченной квантификации — разрешить полиморфным функциям зависеть от некоторого конкретного поведения объектов вместо наследования типов . Она предполагает модель на основе записей для классов объектов, где каждый член класса является элементом записи, а все члены класса являются именованными функциями. Атрибуты объектов представлены как функции, которые не принимают аргументов и возвращают объект. Конкретное поведение тогда представляет собой некоторое имя функции вместе с типами аргументов и типом возвращаемого значения. Ограниченная квантификация рассматривает все объекты с такой функцией. Примером может служить полиморфная min
функция, которая рассматривает все объекты, которые сопоставимы друг с другом. [ необходима цитата ]
F -ограниченная квантификация или рекурсивно ограниченная квантификация , введенная в 1989 году, позволяет более точно типизировать функции, применяемые к рекурсивным типам. Рекурсивный тип — это тип, включающий функцию, которая использует его как тип для некоторого аргумента или его возвращаемого значения. [1]
Этот тип ограничения типа может быть выражен в Java с помощью универсального интерфейса. Следующий пример демонстрирует, как описывать типы, которые можно сравнивать друг с другом, и использовать это в качестве информации о типизации в полиморфных функциях . Test.min
Функция использует простую ограниченную квантификацию и не гарантирует, что объекты будут взаимно сопоставимы, в отличие от Test.fMin
функции, которая использует F-ограниченную квантификацию.
В математической нотации типы двух функций следующие:
где
Интерфейс Сопоставимый < T > { int compareTo ( T other ); }открытый класс Integer реализует Comparable < Integer > { @Override public int compareTo ( Integer other ) { // ... } } Открытый класс String реализует Comparable < String > { @Override public int compareTo ( String other ) { // ... } }public class Test { public static void main ( String [] args ) { final String a = min ( "cat" , "dog" ); final Integer b = min ( 10 , 3 ); final Comparable c = min ( "cat" , 3 ); // Выдает ClassCastException во время выполнения final String str = fMin ( "cat" , "dog" ); final Integer i = fMin ( 10 , 3 ); // final Object o = fMin( "cat", 3); // Не компилируется } 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 . comparableTo ( b ) <= 0 ) { return a ; } else { return b ; } } }