David R.
02/27/2019, 2:31 PMMarc Knaup
02/27/2019, 3:06 PMimport java.util.EnumSet
import kotlin.reflect.KClass
private enum class Dummy
@Suppress("UNCHECKED_CAST")
fun <E: Enum<E>> emptyEnumSet(clazz: KClass<E>) =
EnumSet.noneOf(clazz.java as Class<Dummy>) as EnumSet<E>
@JvmName("emptyEnumSetOfUnspecificClass")
@Suppress("UNCHECKED_CAST")
fun emptyEnumSet(clazz: KClass<out Enum<*>>) =
EnumSet.noneOf(clazz.java as Class<Dummy>) as EnumSet<*>
@Suppress("UNCHECKED_CAST")
inline fun <reified E: Enum<E>> emptyEnumSet() =
EnumSet.noneOf(E::class.java as Class<Dummy>) as EnumSet<E>
enum class MyEnum {
a,b
}
fun main() {
val unspecificEnumClass = MyEnum::class as KClass<out Enum<*>>
val emptySet1 = emptyEnumSet(MyEnum::class)
val emptySet2 = emptyEnumSet<MyEnum>()
val emptySet3 = emptyEnumSet(unspecificEnumClass)
println(emptySet1)
println(emptySet2)
println(emptySet3)
}
David R.
02/27/2019, 3:32 PMMarc Knaup
02/27/2019, 3:34 PMval veryUnspecificClass: Class<*> = unspecificEnumClass.java
val emptySet4 = emptyEnumSet(veryUnspecificClass.kotlin as KClass<out Enum<*>>)
Class<?>
is quite unsafe, hence a cast needed.
Class<out Enum<*>>
would be better 🙂David R.
02/27/2019, 3:38 PMMarc Knaup
02/27/2019, 3:42 PMEnumSet<Dummy>
to EnumSet<*>
🙂David R.
02/27/2019, 3:43 PMMarc Knaup
02/27/2019, 3:49 PMEnumSet
though 😮 Maybe I should add a Kotlin-version of it 🙂