/var/log/jsoizo

メモ帳 技術とか趣味とか

ジェネリクスを含む関数を関数オブジェクトとして扱いたい

このようなジェネリクスがある関数やクラスがあるものとする。

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