KisaragiEffective.github.io

Yeet.

View on GitHub

型変数プログラミングのすゝめ

TL;DR: クラスレスリフレクションを活用してソースをよりスマートにしようという話。

型変数プログラミングとは?

型変数プログラミングとは、表面上はgetClass()classが一度もソース上に出てこないソースを書くことを指す。 例: arrayOf(): Array<E>は一度もE::class.javaが出てこない (実態は、new E[]{}をインライン展開しているだけ)

リフレクションと相性がいい理由

リフレクションで決まってよく出てくるgetClass()。ボイラーコードが多くなりがち。そんなときに上記の例示のような型変数プログラミングを使うとスマートになる。

// SmartReflections.kt
inline fun <reified E> isArray(): Boolean = E::class.java.isArray
// TestReflections.kt
fun main() {
  assertTrue {
    isArray<IntArray>() // => true
  }
}

注記事項

fun main() {
  assertFalse {
    isSameSigniture<() -> Int, () -> Double>() // falseだが、trueになりAssertionError
  }
}