型理論において、限定量化(限定多相性または制約付きジェネリシティとも呼ばれる)とは、特定の型のサブタイプのみに範囲が制限される(「限定」される)全称量化子または存在量化子を指します。限定量化は、パラメトリック多相性とサブタイピングの相互作用です。限定量化は従来、 System F <:の関数型設定で研究されてきましたが、 Java、C#、Scalaなどのパラメトリック多相性(ジェネリクス)をサポートする現代のオブジェクト指向言語でも利用可能です。
限定量化の目的は、多相関数が型の継承ではなく、オブジェクトの特定の振る舞いに依存するようにすることです。これは、オブジェクトクラスに対してレコードベースのモデルを想定しており、すべてのクラスメンバーはレコード要素であり、すべてのクラスメンバーは名前付き関数です。オブジェクトの属性は、引数を取らずにオブジェクトを返す関数として表現されます。特定の振る舞いは、関数名と引数の型、および戻り値の型によって決まります。限定量化は、そのような関数を持つすべてのオブジェクトを考慮します。例としては、min互いに比較可能なすべてのオブジェクトを考慮する多相関数が挙げられます。
1989 年に導入されたF境界量化または再帰境界量化は、再帰型に適用される関数のより正確な型付けを可能にします。再帰型とは、コンストラクタとして、何らかの引数の型、関数引数の戻り値、関数引数の関数戻り値の引数などとしてそれを使用する関数を持つ型です。つまり、正の位置にあります。 [ 1 ]
このような型制約は、 Javaでは汎用インターフェースを使用して表現できます。次の例は、互いに比較可能な型を記述し、それを多相関数の型情報として使用する方法を示しています。この関数は単純な境界量化を使用しており、 F 境界量化を使用する関数Test::minとは対照的に、オブジェクトが相互に比較可能であることを保証しません。Test::fMin
数学的表記では、2つの関数の型は次のようになります。
どこ
次の宣言の可能性を検討してくださいjava.lang。
パッケージjava.lang ;public interface Comparable <T> { int compareTo ( T other ) ; }public class Integer implements Comparable < Integer > { @Override public int compareTo ( Integer other ) { // ... } }public class String implements Comparable < String > { @Override public int compareTo ( String other ) { // ... } }そして、使用時には:
パッケージorg.wikipedia.examples ;public class Test { 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 ; } else { return b ; } }public static void main ( String [] args ) { String a = min ( "cat" , "dog" ); Integer b = min ( 10 , 3 ); Comparable c = min ( "cat" , 3 ); // 実行時に ClassCastException が発生しますString str = fMin ( "cat" , "dog" ); Integer i = fMin ( 10 , 3 ); // Object o = fMin("cat", 3); // コンパイルエラーになります} }