Skip to content

Instantly share code, notes, and snippets.

@KisaragiEffective
Created October 24, 2019 17:11
Show Gist options
  • Save KisaragiEffective/75d77e0fc96e549a56ee2cfdf731c4c3 to your computer and use it in GitHub Desktop.
Save KisaragiEffective/75d77e0fc96e549a56ee2cfdf731c4c3 to your computer and use it in GitHub Desktop.
コンパイル時定数にならないのが惜しいところかな
package com.github.kisaragieffective.kisaragistd.metaprogramming
import java.lang.reflect.Modifier
inline fun <reified T, reified Q> isSameErasure(): Boolean {
return T::class.java == Q::class.java
}
inline fun <reified T> isVoid(): Boolean {
return T::class.java == Void.TYPE
}
inline fun <reified T> isNull(): Boolean {
return when(T::class.java) {
Nothing::class.java -> true
else -> false
}
}
inline fun <reified T> isIntegral(): Boolean {
return when(T::class.java) {
0.toByte().javaClass, 0.toShort().javaClass, 0.javaClass, 0.toLong().javaClass -> true
else -> false
}
}
inline fun <reified T> isFloatingPoint(): Boolean {
return when(T::class.java) {
0.0f.javaClass, 0.0.javaClass -> true
else -> false
}
}
inline fun <reified T> isArray(): Boolean {
return T::class.java.isArray
}
inline fun <reified T> isEnum(): Boolean {
return T::class.java.isEnum
}
inline fun <reified T> isInterface(): Boolean {
return T::class.java.isInterface
}
inline fun <reified T> isFinal(): Boolean {
return (T::class.java.modifiers and Modifier.FINAL) != 0
}
inline fun <reified T> isFunctionalInterface(): Boolean {
return isFunction<T>() || (T::class.java.declaredMethods.size == 1 && T::class.java.declaredMethods[0].modifiers and Modifier.ABSTRACT != 0)
}
inline fun <reified T> isFunction(): Boolean {
return T::class.java.enclosingMethod != null
}
package com.github.kisaragieffective.kisaragistd.metaprogramming
import kotlin.test.assertFalse
import kotlin.test.assertTrue
fun main() {
assertTrue {
isSameErasure<() -> Int, () -> Long>()
}
assertFalse {
isSameErasure<Array<Unit>, Array<Any>>()
}
assertTrue {
isArray<Array<Unit>>()
}
assertTrue {
isArray<IntArray>()
}
assertTrue {
isEnum<SomeEnum>()
}
assertTrue {
isFinal<Unit>()
}
assertTrue {
isFunctionalInterface<() -> Unit>()
}
}
enum class SomeEnum
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment