ジャネリクスの制約とは、文字通りジェネリクスの制約をかける機能です。
制約をかけることで、ジェネリクスは上限境界の型のサブタイプでなければならなくなります。
例を見て見ましょう
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
interface a interface b class A<T> // 1.bに制約をかける class B<T : b> fun main(args: Array<String>){ A<a>() A<b>() // 2.クラスBはaはbのサブタイプでないためコンパイルエラー B<a>() B<b>() } |
ジャネリクスに制約をかけるには、こう書きます
<T(Tが一般的) : 型>
例では、classBに対してinterface bに制約をかけているため、
2.でコンパイルエラーとなります。
Whereを使って複数制約をかける
Whereキーワードを使用することにより、複数制約をかけることができます。
例を見て見ましょう
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
interface a interface b interface c : a, b class A<T> where T : a, T : b class B<T : a> fun main(args: Array<String>) { // 1.a,bと制約をかけているためcのみOK A<c>() // aはもちろんOK B<a>() // 2.cはaとbのサブタイプなのでOk B<c>() // コンパイルエラー B<b>(); } |
1.classAではwhereキーワードを使用し、a,bの複数の制約を
かけているため、cのみOKです。
2.classBでは、aに制約をかけていますので、aはもちろんサブタイプであるcもOKです。
bは、コンパイルエラーになります。