クラスのコンストラクタと同じ引数でなければ、トップレベルに同じ名前のメソッドを定義できる。
class Test (args: String)
fun Test() = "test"
これだけだといまいち使えないけど、ジェネリクスが絡むと使えるかも。
class Test2<T>(clazz: Class<T>) {
// 何かしらの処理
}
inline fun <reified T> Test2(): Test2<T> = Test2(T::class.java)
val test2 = Test2<Int>()
何でこんなの調べたかというと、Gsonを使っているときにListの型情報を保持するクラスを作ったが、class渡すの面倒臭いなと思ったからだ。
// Listの型情報クラス。中身は省略
class ListType<T>(clazz: Class<T>)
// 大文字から始まるメソッドに警告が出るのを抑制
@Suppress("FunctionName")
inline fun <reified T> ListType(): ListType<T> = ListType(T::class.java)
// List<String>の型情報
val type = ListType<String>()
多分他にも使いみちあるかもだけど、今の所思いつかないので省略。
ただ、自分の場合はAndroid StudioのKotlinのカラースキームで、Functions > Package-level function call
がデフォルトでItalicになっていたので、これを調整しないと見た目上違和感があった。