このようなジェネリクスがある関数やクラスがあるものとする。
fun <T> foo(): T = TODO() class Bar<T> (val value: T)
これらの関数やクラスのコンストラクタを関数オブジェクトとして扱いたいとき、このように ::
を付与して KFunction1<T>
のような値を宣言したい。
val fooStringFunc = ::foo<String> val barInt = ::bar<Int>
だが、このコードは以下のエラーによりコンパイルすることができない。
Type arguments are not allowed
宣言する関数オブジェクトの型を明示してあげれば良い。
もう少しいい具合に推論して欲しいところではあるが。。。
val fooStringFunc:KFunction0<String> = ::foo val barInt: KFunction1<Int, Bar<Int>> = ::bar
なお、クラスのコンストラクタの場合はtypealiasをつけると代入先の型を明示しなくても良くなる。
このとき、 barInt
の型は KFunction1<Int, BarInt>
となる
class Bar<T> (val value: T) typealias BarInt = Bar<Int> val barInt = ::BarInt