Created
October 24, 2019 17:11
-
-
Save KisaragiEffective/75d77e0fc96e549a56ee2cfdf731c4c3 to your computer and use it in GitHub Desktop.
コンパイル時定数にならないのが惜しいところかな
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 | |
} | |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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